在XML文档中选择具有多个名称空间值的节点不返回任何内容

时间:2015-12-14 00:28:22

标签: c# xml vb.net

有一个xml文件,如:

<?xml version="1.0" encoding="UTF-8"?>
<Data Version="3" xsi:schemaLocation="uuid:ebfd9-45-48-a9eb-42d Data.xsd" xmlns="uuid:ebfd9-45-48-a9eb-42d" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Info>
    <Muc>Demo</Muc>
  </Info>
</Data>

我在做

Dim m_xmld As XmlDocument
m_xmld = New XmlDocument()
m_xmld.Load("myXML.xml")
Dim test As XmlNode
test = doc.SelectSingleNode("Data/Info", GetNameSpaceManager(m_xmld))

具有:

 Public Shared Function GetNameSpaceManager(ByRef xDoc As XmlDocument) As XmlNamespaceManager
        Dim nsm As New XmlNamespaceManager(xDoc.NameTable)
        Dim RootNode As XPathNavigator = xDoc.CreateNavigator()
        RootNode.MoveToFollowing(XPathNodeType.Element)
        Dim NameSpaces As IDictionary(Of String, String) = RootNode.GetNamespacesInScope(XmlNamespaceScope.All)
        For Each kvp As KeyValuePair(Of String, String) In NameSpaces
            nsm.AddNamespace(kvp.Key, kvp.Value)
        Next
        Return nsm
    End Function

然而,在阅读xml时,我继续获得"Nothing"。有没有办法忽略命名空间?问题是某些名称空间可能因文件而异,这就是我添加GetNameSpaceManager函数...

的原因

1 个答案:

答案 0 :(得分:1)

在XPath中,不带前缀的元素名称始终在空命名空间中考虑。但是在XML中,有默认命名空间默认情况下隐式继承哪些元素,这个元素在您的特定XML中:

xmlns="uuid:ebfd9-45-48-a9eb-42d"

我建议在XPath中使用默认前缀,例如d。然后将前缀映射到根元素的命名空间:

......
Dim nsManager As New XmlNamespaceManager(New NameTable())
nsManager.AddNamespace("d", m_xmld.DocumentElement.NamespaceURI)
test = doc.SelectSingleNode("d:Data/d:Info", nsManager)

上述内容适用于两种情况(带有和不带默认名称空间的XML文档),但不会出现在后代元素级别本地声明默认名称空间的XML。