XPath

2010-04-08 16 views
25

साथ एकाधिक मापदंडों के चयन करें मैं एक XML दस्तावेज जो कुछ इस तरह दिखता है । मैं यह सिर्फ एक परीक्षण के रूप पहले दो मैच के लिए कोशिश कर रहा हूँ:XPath

"/meadinkent/record/comp_div[.='" & comp_div & "'] and /meadinkent/record/sty_ret_type[.='" & sty_ret_type & "']" 

कौन सा विफल हो रहा है, कह रही है कोई नोड्स लौटाए जाते हैं। जाहिर है, मैं बहुत बेवकूफ हूँ - मैं क्या गलत कर रहा हूँ?

चीयर्स, मैट

उत्तर

42

संघ
आदेश दोनों नोड्स आप संघ ऑपरेटर का उपयोग करने की जरूरत है पाने के लिए - |

उदाहरण के लिए, अगले क्वेरी नोड्स के दोनों प्रकार वापस आ जाएगी - comp_div और sty_ret_type:

/meadinkent/record/comp_div | /meadinkent/record/sty_ret_type 

फाई उप नोड्स द्वारा lter महत्व देता
आदेश फिल्टर करने के लिए नोड में अपने उप-नोड्स के आधार पर महत्व देता है आप एक ही कोष्ठक में सभी शर्तों जगह [nodeA='value1' and nodeB='value2']

उदाहरण के लिए, अगले क्वेरी रिकॉर्ड नोड्स जिसका उप नोड्स से मेल खाते हैं वापस आ जाएगी की जरूरत है फिल्टर:

/meadinkent/record[comp_div='MENSWEAR' and sty_ret_type='ACCESSORIES'] 

एसी # संघ उदाहरण:

[Test] 
public void UnionExample() 
{ 
    string xml = 
     @"<meadinkent> 
      <record> 
       <comp_div>MENSWEAR</comp_div> 
       <sty_ret_type>ACCESSORIES</sty_ret_type> 
       <sty_pdt_type>BELTS</sty_pdt_type> 
       <pdt_category>AWESOME_BELTS</pdt_category> 
      </record> 
      </meadinkent>"; 

    XDocument xDocument = XDocument.Parse(xml); 
    IEnumerable<XElement> selectedElements = 
     xDocument.XPathSelectElements(
       "/meadinkent/record/comp_div | /meadinkent/record/sty_ret_type"); 

    Assert.That(selectedElements.Count(), Is.EqualTo(2)); 
} 

एसी # उप नोड्स उदाहरण के द्वारा फिल्टर:

[Test] 
public void FilterExample() 
{ 
    string xml = 
     @"<meadinkent> 
      <record> 
       <comp_div>MENSWEAR</comp_div> 
       <sty_ret_type>ACCESSORIES</sty_ret_type> 
       <sty_pdt_type>BELTS</sty_pdt_type> 
       <pdt_category>AWESOME_BELTS</pdt_category> 
      </record> 
      </meadinkent>"; 

    XDocument xDocument = XDocument.Parse(xml); 
    IEnumerable<XElement> selectedElements = 
     xDocument.XPathSelectElements(
     "/meadinkent/record[comp_div='MENSWEAR' and sty_ret_type='ACCESSORIES']"); 

    Assert.That(selectedElements.Count(), Is.EqualTo(1)); 
    Assert.That(selectedElements.First().Name.LocalName, Is.EqualTo("record")); 
} 
+0

क्षमा करें, मैं अपने आप को स्पष्ट नहीं किया है। मैं बाद में रिकॉर्ड नोड का संदर्भ है जो अंदर सभी तत्व मानों से मेल खाता है। तो अगर मैं यह कहना चाहता हूं कि sty_pdt_type "बेल्ट्स" है और pdt_category "अवेज़बेट्स" है, तो मैं उन सभी रिकॉर्ड नोड्स का संदर्भ चाहता हूं जिनके लिए वे तत्व उन मानों से मेल खाते हैं। –

+0

@ मैट थ्रोवर, अब मैं समझता हूं कि आपका क्या मतलब है :) तदनुसार अद्यतन उत्तर। – Elisha

+0

बहुत बढ़िया, धन्यवाद! –

6

तुम बस की स्थिति का and एड सूची की आवश्यकता है अंदर record के लिए [ ] चयनकर्ता:

/meadinkent/record[compdiv[.='MENSWEAR'] and sty_ret_type[.='ACCESSORIES']] 

पढ़ता के रूप में: एक शीर्ष स्तर meadinkent नोड, एक record नोड के अंतर्गत, एक बच्चा होने compdiv (मूल्य MENSWEAR के साथ) और एक बच्चा sty_ret_rype (मूल्य ACCESSORIES के साथ)।

1

या आप XML को LINQ का उपयोग करें और इस तरह से यह कर सकता है:

var match = XElement.Parse(xmlString); 

var matches = from xml in xmlDocument.Elements() 
       where xml.Element("comp_div").Value == "MENSWEAR" 
       && xml.Element("sty_ret_type").Value == "ACCESSORIES" 
       && xml.Element("sty_pdt_type").Value == "BELTS" 
       && xml.Element("pdt_category").Value == "AWESOME_BELTS" 
       select xml;