2011-11-30 26 views
11

Digamos que existe la siguiente estructura XML:XmlSlurper maravilloso: encontrar elementos en la estructura 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> 

El uso de Groovy XmlSlurper necesito para hacer lo siguiente:

A partir de Data encontrar el elemento que contiene el valor Field #1 en el elemento <DataFieldName>. Si se encuentra, obtenga el valor del correspondiente <DataFieldValue> que pertenece al mismo nivel.

Respuesta

13

Si DataFieldName es único en un archivo:

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

Si no lo es, y que desea obtener una matriz con todas DataFieldValues ​​emparejan:

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

muy impresionante, después de la lectura esto me siento obligado a ir y refactorizar todo mi código XmlSlurper (maldición) –

+2

¿No es eso una 'Lista' de' NodeChildren'? Mejor podría ser: '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

Bienvenido a Stackoverflow. Cuando proporcione una respuesta, incluya un texto sobre por qué funciona su respuesta y cómo difiere de la solución respondida anteriormente. – buczek

Cuestiones relacionadas