我遇到了一个类似的问题:
除此之外,我创建了一个新节点,然后将它的InnerXml属性设置为XML字符串。
参考链接:.NET的XmlDocument如何防止输出中出现空xmlns属性?
我期望的是:
它实际创建的是:
根据MSDN,解析是在当前命名空间上下文中完成的。我原以为当前命名空间上下文不仅适用于newElement,还适用于所有导入的子节点。我使用CreateDocumentFragment()时也遇到了同样的问题。
是否有任何方法可以防止在导入XML字符串时,立即在newElement下的子节点中显示空命名空间?
除此之外,我创建了一个新节点,然后将它的InnerXml属性设置为XML字符串。
参考链接:.NET的XmlDocument如何防止输出中出现空xmlns属性?
Dim ns As String = "http://test"
Dim doc As XmlDocument = New XmlDocument
doc.LoadXml(String.Format("<data xmlns=""{0}""></data>", ns))
Dim newElement As XmlElement = doc.CreateElement("new", ns)
newElement.InnerXml = "<person><name>Joe</name></person>"
Dim result As String = newElement.OuterXml
我期望的是:
<data xmlns="http://test">
<new>
<person>
<name>Joe</name>
</person>
</new>
</data>
它实际创建的是:
<data xmlns="http://test">
<new>
<person xmlns="">
<name>Joe</name>
</person>
</new>
</data>
根据MSDN,解析是在当前命名空间上下文中完成的。我原以为当前命名空间上下文不仅适用于newElement,还适用于所有导入的子节点。我使用CreateDocumentFragment()时也遇到了同样的问题。
是否有任何方法可以防止在导入XML字符串时,立即在newElement下的子节点中显示空命名空间?
xmlns="foo"
时,该元素的命名空间及其所有后代的默认命名空间将为"foo"
- 直到该元素结束或其后代之一使用自己的xmlns
覆盖它。InnerXml
有点特殊,因为在调用它时,主文档的解析已经结束。因此,一个新的解析会话开始,并且不能对默认命名空间做出任何假设,因此它从空命名空间开始。 - Tomalakxmlns = ""
几乎不会有任何破坏性风险,除非它实际上应该存在于某些节点上。SetInnerXml()
也是一种懒惰的方法 - 如果您正在生成XML,则可以使用DOM方法生成节点,如果您从其他地方获取XML,则可以将其解析为临时文档,然后使用.ImportNode()
将其导入到主文档中。 - Tomalak