在.NET中从XmlDocument生成XML时,第一次插入没有关联名称空间的元素时,会出现一个空白的xmlns
属性;如何防止这种情况发生?
示例:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
输出:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
所需输出:
<root xmlns="whatever:name-space-1.0"><loner /></root>
是否有适用于XmlDocument
代码的解决方案,而不是使用OuterXml
将文档转换为字符串后发生的情况
我这样做的理由是看看是否可以使用XmlDocument生成的XML匹配特定协议的标准XML。空白的xmlns
属性可能不会破坏或混淆解析器,但在我所见过的该协议的任何用法中也不存在该属性。
发布于 2008-09-25 20:49:13
多亏了Jeremy Lew的回答和更多的实践,我知道了如何删除空白的xmlns
属性:在创建任何您不想在其上添加前缀的子节点时,传入根节点的名称空间。在根上使用没有前缀的名称空间意味着您需要对子元素使用相同的名称空间,以便它们也没有前缀。
已修复代码:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0"));
Console.WriteLine(xml.OuterXml);
感谢大家的回答,让我找到了正确的方向!
发布于 2011-12-30 12:02:18
这是JeniT答案的一个变体(顺便说一句,非常非常感谢!)
XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);
这样就不必在任何地方复制或重复名称空间。
发布于 2008-09-25 18:23:03
如果示例XML中的<loner>
元素没有xmlns
默认名称空间声明,那么它应该在whatever:name-space-1.0
名称空间中,而不是不在名称空间中。如果这是您想要的,则需要在该名称空间中创建元素:
xml.CreateElement("loner", "whatever:name-space-1.0")
如果希望<loner>
元素不在名称空间中,那么生成的XML就是您所需要的,并且不必担心自动为您添加的xmlns
属性。
https://stackoverflow.com/questions/135000
复制相似问题