2011-11-30 10 views
11

मान लीजिए कि निम्नलिखित XML संरचना होती है दो:ग्रूवी XmlSlurper: XML संरचना में तत्वों का पता लगाएं

<Data> 
    <DataFieldText> 
     <DataFieldName>Field #1</DataFieldName> 
     <DataFieldValue>1</DataFieldValue> 
    </DataFieldText> 
    <DataFieldText> 
     <DataFieldName>Field #2</DataFieldName> 
     <DataFieldValue>2</DataFieldValue> 
    </DataFieldText> 
    <DataFieldText> 
     <DataFieldName>Field #3</DataFieldName> 
     <DataFieldValue>3</DataFieldValue> 
    </DataFieldText> 
</Data> 

का उपयोग ग्रूवी के XmlSlurper मैं निम्नलिखित कार्य करने होंगे:

Data से शुरू है कि तत्व है जो होता है लगता है <DataFieldName> तत्व में मूल्य Field #1। यदि पाया जाता है तो संबंधित <DataFieldValue> का मान प्राप्त करें जो एक ही स्तर से संबंधित है।

उत्तर

13

तो DataFieldName एक फ़ाइल में अद्वितीय है:

println new XmlSlurper() 
    .parseText(xml) 
    .DataFieldText.find {it.DataFieldName == "Field #1"} 
    .DataFieldValue.text() 

यदि ऐसा नहीं है, और आप सभी मिलान DataFieldValues ​​साथ एक सरणी प्राप्त करना चाहते हैं:

println new XmlSlurper() 
    .parseText(xml) 
    .DataFieldText.findAll {it.DataFieldName == "Field #1"}*.DataFieldValue*.text() 
+0

बहुत प्रभावशाली पढ़ने के बाद, यह मुझे अपने सभी XmlSlurper कोड (शाप आपको) –

+2

पर जाने और फिर से प्रतिक्रिया करने के लिए मजबूर महसूस करता है क्या यह 'नोड चिल्ड्रेन' की 'सूची' नहीं है? बेहतर हो सकता है: 'नया XmlSlurper()। ParseText (xml) .डेटाफ़ील्डटेक्स्ट.फिंडएल {it.DataFieldName.text() ==' फ़ील्ड # 1 '} *। डेटाफ़िल्ल्डवैल्यू * .text() ' –

-1
def xml = """<Data>  
    <DataFieldText>  
     <DataFieldName>Field #1</DataFieldName>  
     <DataFieldValue>1</DataFieldValue>  
    </DataFieldText>  
    <DataFieldText>  
     <DataFieldName>Field #2</DataFieldName>  
     <DataFieldValue>2</DataFieldValue>  
    </DataFieldText>  
    <DataFieldText>  
     <DataFieldName>Field #3</DataFieldName>  
     <DataFieldValue>3</DataFieldValue>  
     </DataFieldText>  
</Data>"""  
def payload = new XmlSlurper().parseText(xml)  
def node = payload.'**'.find() { myNode -> myNode.DataFieldName.text() == 'Field #1' }  
value = node.DataFieldValue?.text()  
println "${value}\n"  
+0

स्टैक ओवरफ्लो में आपका स्वागत है। जब आप कोई उत्तर देते हैं, तो कृपया अपना उत्तर क्यों काम करता है और यह पहले बताए गए समाधान से अलग कैसे है इसके बारे में कुछ टेक्स्ट शामिल करें। – buczek

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