Groovy XmlSlurper: найти элементы в структуре XML

Скажем, существует следующая структура 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>, которое принадлежит к тому же уровню.

Ответ 1

Если 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()

Ответ 2

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"