2012-10-22 8 views
5

Ich versuche, eine große XML-Datei zu analysieren, und ich verwende viele relative Pfad für die XPath-Ausdrücke.XPath Ausdruck Bewertungsfehler

Jetzt habe ich Probleme mit der .net XPath-Auswertung.

Hier ein kleines Beispiel, das mein Problem erklärt:

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

Und hier ist der Code:

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

bekomme ich folgende Fehlermeldung: Zusätzliche Informationen: ‚// Preis /. . [Jahr = '2005'] 'hat ein ungültiges Token.

Für mich scheint es ein gültiger XPath-Ausdruck zu sein, da andere Tools wie XMLSpy diesen Ausdruck erfolgreich auswerten.

+4

.NET unterstützt XPath 2.0 nicht. –

+0

@ MatíasFidemraizer, die eine Menge erklärt, danke – exagi

+0

wenn das Jahr vor dem Preis kommt, könnte man '// price [previous-sibling :: year = '2005']' verwenden. – Pawel

Antwort

1

Warum linq2xml nicht

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 

verwenden Wenn Sie die XPath-Version wollen, hier ist es

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

Wenn Sie bei http://www.w3.org/TR/xpath/#NT-Step an der XPath-Spezifikation suchen wir, dass der Schritt der Produktion sehen ist definiert als:

Step ::= AxisSpecifier NodeTest Predicate*  
     | AbbreviatedStep 

In anderen Bei Wörtern kann ein Prädikat keinem abgekürzten Schritt folgen, wie z. oder .. ich würde annehmen, dass die Umsetzung daher (strikt) korrekt ist. Vielleicht ist XMLSpy in seiner Interpretation etwas liberaler und expandiert einfach immer .. to parent: node()?

Verwandte Themen