2011-11-30 53 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