XmlDocument - 前缀“”不能从“”重新定义为“X”
本文关键字:定义 前缀 不能 XmlDocument 新定义 | 更新日期: 2023-09-27 18:30:57
我正在这样做:
var xml = new XmlDocument();
xml.AppendChild(xml.CreateXmlDeclaration("1.0", Encoding.UTF8.BodyName, "yes"));
var el = (XmlElement)xml.AppendChild(xml.CreateElement("Document"));
el.SetAttribute("xmlns", "urn:iso:std:iso:20022:tech:xsd:" + SepaSchemaUtils.SepaSchemaToString(schema));
然后,为了使XML缩进,我这样做:
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings
{
Indent = true,
IndentChars = " ",
NewLineChars = "'r'n",
NewLineHandling = NewLineHandling.Replace
};
using (XmlWriter writer = XmlWriter.Create(sb, settings))
{
doc.Save(writer);
}
当文档时,我收到异常。保存(编写器)被执行。
System.Xml.XmlException:前缀"不能从"重新定义为 'urn:iso:std:iso:20022:tech:xsd:pain.001.001.03' 在同一开头 元素标记。
我已经尝试了我能找到的一切。谢谢。
您尝试创建不在命名空间中的 Document
元素,但同时设置默认命名空间。我怀疑你只是想要:
String ns = "urn:iso:std:iso:20022:tech:xsd:" + SepaSchemaUtils.SepaSchemaToString(schema);
var xml = new XmlDocument();
xml.AppendChild(xml.CreateXmlDeclaration("1.0", Encoding.UTF8.BodyName, "yes"));
var el = (XmlElement) xml.AppendChild(xml.CreateElement("Document", ns));
el.SetAttribute("xmlns", ns);
或者,我强烈建议使用 LINQ to XML,它使此任务和许多其他任务变得更加简单。
除了Jon Skeet的答我要补充一点,我觉得在使用 XML 时不需要 LINQ(如果有的话)。我使用一些简单的帮助程序函数管理命名空间。它们是我XmlDocUtil
模块的一部分,我无法完整分享,只举一个小例子:
using System ;
using System.Xml ;
using System.Text;
static class Test {
/* ------------------------------ XML helpers ------------------------------- */
static XmlDocument XParDoc( XmlNode parent )
{ XmlDocument pardoc;
if( parent.OwnerDocument == null ) pardoc = ( XmlDocument )parent;
else pardoc = parent.OwnerDocument;
return pardoc;
}
static XmlElement XAddTag
( XmlNode parent,
string tag
)
{ return XAddTagNs( parent, tag, parent.NamespaceURI ); }
static XmlElement XAddTagNs( XmlNode parent, string name, string ns )
{ XmlElement elem;
elem = XParDoc( parent ).CreateElement( name, ns );
parent.AppendChild( elem );
return elem;
}
/* ----------------------------- Demonstration ------------------------------ */
static void Main()
{ XmlDocument doc;
XmlNode root, node;
doc = new XmlDocument();
// Add a tag with an explicitely specified namespace:
root = XAddTagNs ( doc , "root" , "root/ns/uri" );
// Inherit the root namespace:
node = XAddTag ( root, "under_root" );
node = XAddTag ( node, "terminal_1" );
// Add a tag with anoher namespace:
node = XAddTagNs ( root, "another" , "other/ns/uri" );
// Inherit that other namespace:
node = XAddTag ( node, "under_another" );
// Add a tag without a namespace:
node = XAddTagNs ( root, "no_ns" , null );
// ...and one under it:
node = XAddTagNs ( node, "under_no_ns" , null );
// Print the result to console:
Console.Write( XmlToStr( doc ) );
}
static string XmlToStr( XmlDocument doc )
{ StringBuilder sb;
XmlWriter xw;
XmlWriterSettings xw_sets;
sb = new StringBuilder();
xw_sets = new XmlWriterSettings();
xw_sets.Indent = true;
xw_sets.IndentChars = " ";
xw = XmlWriter.Create( sb, xw_sets );
doc.WriteTo( xw );
xw.Dispose();
return sb.ToString();
}
}
上面的程序打印:
<?xml version="1.0" encoding="utf-16"?>
<root xmlns="root/ns/uri">
<under_root>
<terminal_1 />
</under_root>
<another xmlns="other/ns/uri">
<under_another />
</another>
<no_ns xmlns="">
<under_no_ns />
</no_ns>
</root>
这定义命名空间的方式是保存每个标签的命名空间prefix:
的限定,并依靠自然命名空间继承来简化事情。