所以当我使用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”前缀?
答案 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)