एक्सपीथ के माध्यम से विशेषता नोड का मान निकालें


269

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

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

<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विशेषता का मूल्य रखना चाहूंगा ।

मेरे नमूने XML फ़ाइल के लिए, यहां बताया गया है कि मैं क्या होना चाहूंगा:

Child_2
Child_4
Child_1
Child_3

जवाबों:


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

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


14
मैं सहमत हूं, सवाल यह था कि विशेषता का मूल्य कैसे प्राप्त किया जाए
व्लाद्न

5
क्या होगा अगर मैं केवल टैग के बीच में मौजूद मूल्य / विवरण / डेटा को निकालना चाहूंगा ....
दीनू ड्यूक

146

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

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

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


1
इसके साथ xqillaही फोन करना जरूरी था xs:string। मुझे आश्चर्य है क्योंकि।
krlmlr

1
@krlmlr संभवतः xsXPath फ़ंक्शन के लिए नाम स्थान उपसर्ग है। इसलिए वे दूसरों के साथ घुलमिल नहीं पाते हैं।
acdcjunior

4
जबरदस्त हंसी। यह एकमात्र उत्तर है जो वास्तव में प्रश्न का उत्तर देता है। +1
james.garriss

3
यह xmllint में केवल पहली हिट प्रदान करेगा
crazyduck

1
क्या होगा यदि मेरे पास विशेषताओं की सूची है और मुझे उनके मूल्यों की आवश्यकता है? स्ट्रिंग () केवल पहला मान वापस करने के लिए लगता है।
दमलूार

8

आपको उपयोग करना चाहिए //Parent[@id='1']/Children/child/data(@name)

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


7

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

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

केवल उसके विधेय द्वारा निर्दिष्ट name4 childनोड्स की विशेषता को आउटपुट करेगा । फिर आपको अगले के लिए नोड्स के सेट को प्राप्त करने के लिए विधेय को बदलने की आवश्यकता होगी ।Parent[@id=1][@id=2]childParent

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

//child/@name

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

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

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

यह वह स्थिति है जिसका उपयोग किया जा सकता है जहां तत्व में 2 विशेषता है और हम एक विशेषता को दूसरे की मदद से प्राप्त कर सकते हैं।


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

1

नाम के साथ सभी xml के लिए स्थानीय-नाम का उपयोग करें ()

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.