在新 XmlElement 上设置 InnerXml 后空白 xmlns=""

Blank xmlns="" after setting InnerXml on new XmlElement

我遇到了类似的问题:

How to prevent blank xmlns attributes in output from .NET's XmlDocument?

除非我正在创建一个新节点,然后将其 InnerXml 属性 设置为字符串 XML。

    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下的子节点出现空的Namespace吗?

声明:

The parsing is done in the current namespace context.

意味着您的 XML 字符串可能包含的任何名称空间前缀都将在文档定义的名称空间前缀的上下文中进行解释。

这导致以下事情起作用:

Const ns As String = "http://test"
Const ns_foo As String = "http://www.example.com"

Dim doc As XmlDocument = New XmlDocument()
doc.LoadXml(String.Format("<data xmlns=""{0}"" xmlns:foo=""{1}""></data>", ns, ns_foo))

Dim newElement As XmlElement = doc.CreateElement("new", ns)
doc.DocumentElement.AppendChild(newElement)

newElement.InnerXml = "<foo:person><foo:name>Joe</foo:name></foo:person>"

结果是

<data xmlns:foo="http://www.example.com" xmlns="http://test">
   <new>
      <foo:person>
         <foo:name>Joe</foo:name>
      </foo:person>
   </new>
</data>

但是, 没有前缀的节点根据定义不在特定的命名空间中。它们位于 默认命名空间 中。

设置 InnerXml 时无法影响默认命名空间。始终假定默认命名空间是空命名空间。