有一个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
函数...
答案 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。