Ошибка оценки выражения XPath

Я пытаюсь разобрать большой XML-файл и использую много относительных путей для выражений XPath.

Теперь у меня проблемы с оценкой.net XPath.

Вот небольшой пример, который объясняет мою проблему:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
</book> 
</bookstore>

И вот код:

static void Main(string[] args)
{
    System.Xml.XmlDocument d = new System.Xml.XmlDocument();
    d.Load(@"D:\simpleXml.xml");

    System.Diagnostics.Trace.WriteLine(d.SelectSingleNode("//price/..[year=\'2005\']").Name);
}

Я получаю следующее сообщение об ошибке: Дополнительная информация: '//price/..[year='2005']'имеет недопустимый токен.

Мне кажется, это правильное выражение XPath, поскольку другие инструменты, такие как XMLSpy, успешно оценивают это выражение.

2 ответа

Почему бы не использовать linq2xml

XDocument doc=XDocument.Load("yourXML");

var bookPrice=doc.Descendants("book")
.Where(x=>x.Element("year").Value=="2005")
.Select(y=>y.Element("price").Value);
//gets the price of the books published in 2005

Если вы хотите версию xpath, вот она

"bookstore/book[year='2005']/*/../price"
//gets the price of the books published in 2005

Если вы посмотрите на спецификацию XPath по адресу http://www.w3.org/TR/xpath/, мы увидим, что производство Step определяется как:

Step  ::=  AxisSpecifier NodeTest Predicate*    
         | AbbreviatedStep

Другими словами, предикат не может следовать за сокращенным шагом, таким как. или.. Я бы предположил, что реализация поэтому (строго) правильна. Возможно, XMLSpy немного более либерален в своей интерпретации и просто всегда расширяется.. до parent:node()?

Другие вопросы по тегам