2012-10-22 18 views
5

मैं एक बड़ी एक्सएमएल फ़ाइल को पार्स करने का प्रयास करता हूं और मैं XPath अभिव्यक्तियों के लिए बहुत से सापेक्ष पथ का उपयोग कर रहा हूं।XPath अभिव्यक्ति मूल्यांकन त्रुटि

अब मैं .NET XPath मूल्यांकन के साथ एक समस्या में भाग रहा हूं।

यहाँ एक छोटा सा उदाहरण है जो मेरी समस्या बताते हैं:

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

मैं निम्न त्रुटि संदेश मिलता है: यहाँ

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

और कोड है अतिरिक्त जानकारी: '// मूल्य /। [वर्ष = '2005'] 'में एक अवैध टोकन है।

मेरे लिए, यह एक वैध XPath अभिव्यक्ति प्रतीत होता है, क्योंकि XMLSpy जैसे अन्य टूल सफलतापूर्वक उस अभिव्यक्ति का मूल्यांकन करते हैं।

+4

.NET XPath 2.0 का समर्थन नहीं करता है। –

+0

@ MatíasFidemraizer जो बहुत कुछ बताता है, धन्यवाद – exagi

+0

यदि वर्ष मूल्य से पहले आता है तो आप '// कीमत [पूर्ववर्ती-भाई :: वर्ष = '2005']' का उपयोग कर सकते हैं। – Pawel

उत्तर

1

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 
0

आप http://www.w3.org/TR/xpath/#NT-Step पर XPath कल्पना को देखें, तो हम देख सकते हैं कि चरण उत्पादन के रूप में परिभाषित किया गया है:

Step ::= AxisSpecifier NodeTest Predicate*  
     | AbbreviatedStep 

ओथ में er शब्द, एक predicate एक संक्षिप्त चरण का पालन नहीं कर सकते हैं, जैसे कि। या .. मुझे लगता है कि कार्यान्वयन इसलिए (कड़ाई से) सही है। शायद XMLSpy इसकी व्याख्या में थोड़ी अधिक उदार है और हमेशा विस्तारित करता है .. माता-पिता के लिए: नोड()?

संबंधित मुद्दे