XPath

2011-01-29 21 views
188

के माध्यम से विशेषता नोड का मूल्य निकालें XPath के माध्यम से एक विशेषता नोड का मान कैसे निकाला जा सकता है?XPath

एक नमूना एक्सएमएल फ़ाइल है:

<parents name='Parents'> 
    <Parent id='1' name='Parent_1'> 
    <Children name='Children'> 
     <child name='Child_2' id='2'>child2_Parent_1</child> 
     <child name='Child_4' id='4'>child4_Parent_1</child> 
     <child name='Child_1' id='3'>child1_Parent_1</child> 
     <child name='Child_3' id='1'>child3_Parent_1</child> 
    </Children> 
    </Parent> 
    <Parent id='2' name='Parent_2'> 
    <Children name='Children'> 
     <child name='Child_1' id='8'>child1_parent2</child> 
     <child name='Child_2' id='7'>child2_parent2</child> 
     <child name='Child_4' id='6'>child4_parent2</child> 
     <child name='Child_3' id='5'>child3_parent2</child> 
    </Children> 
    </Parent> 
</parents> 

अब तक मैं इस XPath स्ट्रिंग है:

//Parent[@id='1']/Children/child[@name] 

यह केवल child तत्वों देता है, लेकिन मैं name विशेषता के मान करना चाहते हैं ।

मेरी नमूना एक्सएमएल फ़ाइल के लिए, यहाँ मैं अपनी पसंद का उत्पादन होने का है:

Child_2 
Child_4 
Child_1 
Child_3 
+0

संभावित डुप्लिकेट [XPath का उपयोग करके विशेषता प्राप्त करना] (http: // stackoverflow।कॉम/प्रश्न/4531995/हो रही-विशेषता-उपयोग-xpath) – tripleee

उत्तर

254
//Parent[@id='1']/Children/child/@name 

आपका मूल child[@name] एक तत्व child जो एक विशेषता name है का मतलब है। आप child/@name चाहते हैं।

+13

मैं मानता हूं कि प्रश्न – Vladtn

+3

विशेषता का मूल्य कैसे प्राप्त करें, यदि मैं केवल टैग के बीच मौजूद मूल्य/विवरण/डेटा निकालना चाहता हूं तो क्या होगा। ... –

1

@ryenus, आपको परिणाम के माध्यम से लूप की आवश्यकता है। इस तरह मैं इसे vbscript में करूँगा;

Set xmlDoc = CreateObject("Msxml2.DOMDocument") 
xmlDoc.setProperty "SelectionLanguage", "XPath" 
xmlDoc.load("kids.xml") 

'Remove the id=1 attribute on Parent to return all child names for all Parent nodes 
For Each c In xmlDoc.selectNodes ("//Parent[@id='1']/Children/child/@name") 
    Wscript.Echo c.text 
Next 
101

(विशेषता नाम के बिना) बस मूल्य पाने के लिए, string() का उपयोग करें:

string(//Parent[@id='1']/Children/child/@name)

fn:string() fucntion xs:string के रूप में अपनी बहस के परिणाम प्रदान करेंगे। यदि इसकी तर्क एक विशेषता है, तो यह विशेषता के मान को xs:string के रूप में वापस कर देगा।

+1

'xqilla' के साथ' xs: string' को कॉल करना आवश्यक था। मुझे आश्चर्य है क्योंकि। – krlmlr

+1

@krlmlr शायद 'xs' XPath फ़ंक्शंस के लिए नेमस्पेस उपसर्ग है। तो वे दूसरों के साथ मिश्रित नहीं हैं। – acdcjunior

3
//Parent/Children[@ Attribute='value']/@Attribute 

यह वह मामला है जिसका उपयोग तत्व के 2 गुण होने पर किया जा सकता है और हम किसी अन्य की सहायता से एक विशेषता प्राप्त कर सकते हैं।

5

आप //Parent[@id='1']/Children/child/data(@name)

विशेषताओं धारावाहिक नहीं किया जा सकता का उपयोग करें ताकि आप उन्हें एक xml देख परिणाम में वापस नहीं लौट सकते चाहिए। आपको डेटा() फ़ंक्शन का उपयोग करके विशेषता से डेटा प्राप्त करना है।

+2

'xmllint' –

+0

के साथ काम नहीं करता है .net के साथ काम नहीं करता है – toddmo

5

जैसा कि ऊपर उत्तर दिया:

//Parent[@id='1']/Children/child/@name 

केवल उत्पादन Parent अपने विधेय [@ आईडी = 1] द्वारा निर्दिष्ट से संबंधित 4 child नोड्स के name विशेषता। अगले Parent के लिए आपको child नोड्स का सेट प्राप्त करने के लिए आपको भविष्यवाणी को [@id=2] पर बदलने की आवश्यकता होगी।

हालांकि, अगर आप Parent नोड पूरी तरह और उपयोग पर ध्यान न दें:

//child/@name 

आप सभी child नोड्स के name विशेषता एक ही बार में चुन सकते हैं।

name="Child_2" 
name="Child_4" 
name="Child_1" 
name="Child_3" 
name="Child_1" 
name="Child_2" 
name="Child_4" 
name="Child_3"