Ошибка оценки выражения 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()?