2011-11-30 6 views
11

Diciamo che c'è la seguente struttura XML:XmlSlurper Groovy: Trova elementi nella struttura 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> 

Utilizzando Groovy XmlSlurper ho bisogno di fare quanto segue:

A partire da Data trovare quell'elemento che contiene il valore Field #1 nell'elemento <DataFieldName>. Se trovato, ottieni il valore dello <DataFieldValue> corrispondente che appartiene allo stesso livello.

risposta

13

Se DataFieldName è unico in un file:

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

Se non lo è, e si desidera ottenere un array con tutti DataFieldValues ​​corrispondenti:

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

molto impressionante, dopo la lettura questo mi sento obbligato ad andare a rifattorizzare tutto il mio codice XmlSlurper (maledici) –

+2

Non è un 'Elenco' di' NodoChildren'? Meglio potrebbe essere: 'nuovo 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

Benvenuti in Stackoverflow. Quando fornisci una risposta, ti preghiamo di includere del testo sul perché la tua risposta funziona e in che modo differisce dalla risposta alla soluzione precedente. – buczek