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"