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

本文关键字:节点 空间 结果 任何 返回 文档 XML 选择 | 更新日期: 2023-09-27 18:26:35

有一个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函数的原因。。。

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

在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文档),但不适用于具有在子代元素级别本地声明的默认名称空间。