使用XPath和VB.NET来解析包含namespsaces的XML

时间:2013-06-05 20:42:32

标签: xml vb.net xpath xml-namespaces

有几个相关问题,但没有一个提供我需要的指导。

假设以下XML:

<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>
<feed xmlns="http://www.w3.org/2005/Atom"  xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"  xmlns:blogger="http://schemas.google.com/blogger/2008"  xmlns:georss="http://www.georss.org/georss"  xmlns:gd="http://schemas.google.com/g/2005"  xmlns:thr="http://purl.org/syndication/thread/1.0" >
<entry>
<title type="text">This is the title</title>
<content>lorem ipsum</content>
</entry>
<entry>
<title type="text">This is the second title</title>
<content>lorem ipsum 2</content>
</entry>
</feed>

如果此文档没有名称空间,我可以编写如下代码:

Public Sub ShowXML(XmlText As String)
    Dim doc As New XmlDocument
    doc.LoadXml(XmlText)
    For Each Entry As XmlNode In doc.SelectNodes("//entry")
        Console.WriteLine(Entry.SelectSingleNode("title").InnerText)
    Next
End Sub

由于名称空间,这是不可能的。这是我最近的尝试:

Public Sub ShowXML(XmlText As String)
    Dim doc As New XmlDocument
    doc.LoadXml(XmlText)
    Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
    nsmgr.AddNamespace("rss", "http://www.w3.org/2005/Atom")
    For Each Entry As XmlNode In doc.SelectNodes("//rss:entry")
        Console.WriteLine(Entry.SelectSingleNode("/rss:title").InnerText)
    Next
End Sub

获取“标题”的正确XPath语法是什么?

为什么这是与其他相似主题的问题不同的原因:

  1. 其他大多数例子都是C#,我正在寻找一个VB.NET 解。
  2. 其他例子没有涉及的情况 从先前选择的节点导航到节点。
  3. 我不是在寻找剥离命名空间的解决方案;我想了解他们。谢谢。

1 个答案:

答案 0 :(得分:2)

您的内部XPath /rss:title具有前导/,表示此搜索应从文档顶部开始,而不管您当前是否在子节点上。

相反,只需使用rss:title即可获得您所追求的节点。