2012-10-22 23 views
5

Próbuję przeanalizować duży plik XML i używam wielu względnych ścieżek dla wyrażeń XPath.Błąd oceny wyrażenia XPath

Teraz mam problem z oceną XP .ath .net.

Oto mały przykład, który wyjaśnia mój problem:

<?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> 

A oto kod:

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); 
} 

pojawia się następujący komunikat o błędzie: Dodatkowe informacje: „// Cena /. . [year = '2005'] 'ma nieprawidłowy token.

Wydaje mi się, że jest to poprawne wyrażenie XPath, ponieważ inne narzędzia, takie jak XMLSpy, pomyślnie oceniają to wyrażenie.

+4

. NET nie obsługuje XPath 2.0. –

+0

@ MatíasFidemraizer, który bardzo dużo tłumaczy, dziękuję – exagi

+0

, jeśli rok jest przed ceną, możesz użyć '// price [previous-sibling :: year = '2005']'. – Pawel

Odpowiedz

1

Dlaczego nie skorzystać 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 

Jeśli chcesz wersję XPath, tutaj jest

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

Jeśli spojrzeć na spec XPath w http://www.w3.org/TR/xpath/#NT-Step widzimy, że produkcja Krok jest zdefiniowany jako:

Step ::= AxisSpecifier NodeTest Predicate*  
     | AbbreviatedStep 

W innym er słowa, predykat nie może podążać skróconym krokiem, takim jak. lub ... Zakładam, że wdrożenie jest (ściśle) poprawne. Być może XMLSpy jest nieco bardziej liberalny w swojej interpretacji i po prostu zawsze rozszerza ... na parent: node()?