C # Parsing XML node с помощью XPathNavigator

У меня есть этот образец XML, сохраненный в books.xml:

<?xml version="1.0" encoding="utf-8" ?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>
      An in-depth look at creating applications
      with XML.
    </description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>
      A former architect battles corporate zombies,
      an evil sorceress, and her own childhood to become queen
      of the world.
    </description>
  </book>
</catalog>

Я создал такой документ и навигатор:

var document = new XPathDocument(@"books.xml");
var navigator = document.CreateNavigator();
var books = navigator.Select("/catalog/book");

Я пытаюсь просмотреть узлы книги и проанализировать контекст узла. Я могу читать атрибуты, но не могу понять, как читать значения узла:

while (books.MoveNext())
{
    var location = books.Current;
    var book = new Book();
    book.Id = location.GetAttribute("id", "");
                    
    // this line throws an exception.
    book.Title = (string)location.Evaluate("title/text()") ;
}

Кто-нибудь, кто знает, что я пропустил из документации?

Пожалуйста, мне известно о методах синтаксического анализа XElement, XmlDocument и XmlTextReader, но мне нужно выяснить, как работает XPathNavigator, для сравнения производительности.

TIA.


person Klaus Nji    schedule 25.05.2013    source источник


Ответы (2)


Чтобы получить узел и его значение, вы должны использовать метод SelectSingleNode(), например это...

var node = location.SelectSingleNode("title");
book.Title = node != null ? node.Value : string.Empty;

По производительности, вот несколько предыдущих вопросов:

Что лучше для повышения производительности: XPathNavigator с XPath против Linq to Xml с запросом?

Насколько велика разница в скорости между XPathNavigator и XmlReader правда?

person davmos    schedule 25.05.2013
comment
Спасибо. Это именно то, что мне нужно. - person Klaus Nji; 26.05.2013

Вы пробовали XmlReader?

var reader = new XmlReader("");
while(reader.ReadToFolowing("book")){
    reader.ReadInnerXml();
}
person user2421312    schedule 26.05.2013