2013-06-05 3 views
1

Существует несколько взаимосвязанных вопросов, но ни один из них не содержит рекомендаций, которые мне нужны.Использование XPath и VB.NET для синтаксического анализа XML, содержащего имена.

Предполагая, что следующий 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. Другие примеры не относятся к сценарию , перемещающемуся к узлу из ранее выбранного узла.

Я не ищу решение, которое разбивает пространства имен; Я хочу их понять. Спасибо.

ответ

2

Ваш внутренний XPath, /rss:title, имеет ведущий /, который указывает, что этот поиск должен начинаться с верхней части документа независимо от того, что вы сейчас находитесь на дочернем узле.

Вместо этого просто используйте rss:title, и вы получите узел, которым вы пользуетесь.

+0

Благодарим вас, Дейв. Возможно, однажды я получу свою ненависть к пространствам имен XML. :) – DWRoelands

+0

@DWRoelands - согласен. Я не понимаю, почему они сделали поиск с пространством имен по умолчанию настолько сложным, что это пространство имен * по умолчанию *. Oi! –

Смежные вопросы