2011-11-30 54 views
11

比方說,有以下XML結構:的Groovy的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> 

使用Groovy的XmlSlurper我需要做到以下幾點:

Data開始發現其中包含了該元素值Field #1<DataFieldName>元素中。如果找到,則獲得屬於同一級別的相應<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

是不是'NodeChildren'的List?更好的可能是:'new XmlSlurper()。parseText(xml).DataFieldText.findAll {it.DataFieldName.text()=='Field#1'} * .DataFieldValue * .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

歡迎來到Stackoverflow。當您提供答案時,請附上一些關於您答案的工作原理以及與以前答案不同的文字。 – buczek