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

时间:2016-03-31 15:51:56

标签: .net xml vb.net xml-namespaces xmldocument

我遇到了类似的问题:

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下的子节点显示空名称空间?

1 个答案:

答案 0 :(得分:3)

声明:

  

解析在当前名称空间上下文中完成。

表示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时,无法影响默认命名空间。始终假定默认命名空间是空命名空间。