解析XML时为什么需要XmlNamespaceManager

时间:2011-03-24 15:49:35

标签: xml vb.net visual-studio-2010

所以当我使用selectSingleNode获取null值时,我发现我需要声明一个命名空间,因为我使用的是xmlns属性。我的问题是为什么我需要在解析xml时使用前缀,如果我不在xml文件中使用前缀?

我有xmlns属性的原因是因为我的xml输出的接收端需要它。我宁愿从基础xml中读取它而不是在程序中硬编码。

这是可行的代码

xmlns = New XmlNamespaceManager(xmlTemplate.NameTable)
xmlns.AddNamespace("dc", ns)

我试过这样做 - 不起作用

xmlns = New XmlNamespaceManager(xmlTemplate.NameTable)
xmlns.AddNamespace(String.Empty, ns)

简而言之,有没有办法摆脱“dc”前缀?

2 个答案:

答案 0 :(得分:4)

这只是“他们建造它的方式”中的一种。根据{{​​3}}:

  

XmlNamespaceManager允许添加   使用空的默认命名空间   string作为前缀。但是,XPath   将空前缀视为null   命名空间。换句话说,只有   映射到命名空间的前缀可以是   用于XPath查询。如果你想   使用XML中的默认命名空间   然后,XPath表达式中的文档   你需要为它定义一个前缀。

还来自MSDN (XPath Queries with Namespaced Mapped Prefixes)

  

如果XmlNamespaceManager将是   用于解析。中的命名空间   XML Path Language(XPath)表达式,   必须指定前缀。如果   XPath表达式不包括   前缀,假设是   namespace统一资源标识符   (URI)是空命名空间

修改

我假设您的代码类似于:

Dim S = "<xml xmlns=""http://www.exmaple.com/""><node/></xml>"

Dim X As New Xml.XmlDocument()

X.LoadXml(S)
Dim NS As New Xml.XmlNamespaceManager(X.NameTable)
NS.AddNamespace("dc", "http://www.exmaple.com/")

''//Will not work
Dim N1 = X.SelectSingleNode("//xml/node", NS)
If N1 Is Nothing Then
    Trace.WriteLine("Node not found")
Else
    Trace.WriteLine("Node found")
End If

''//Works
Dim N2 = X.SelectSingleNode("//dc:xml/dc:node", NS)
If N2 Is Nothing Then
    Trace.WriteLine("Node not found")
Else
    Trace.WriteLine("Node found")
End If

答案 1 :(得分:2)

您应该能够从传入的XML获取命名空间,而不必通过执行以下操作来对其进行硬编码:

NS.AddNamespace("dc",X.DocumentElement.Attributes("xmlns").InnerText)