2011-11-30 20 views
11

Można powiedzieć, że jest następująca struktura XML:Groovy XmlSlurper: Znajdź elementy w strukturze 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> 

Korzystanie Groovy na XmlSlurper muszę wykonać następujące czynności:

Począwszy od Data znaleźć ten element, który zawiera wartość Field #1 w elemencie <DataFieldName>. Jeśli zostanie znaleziony, to uzyskaj wartość odpowiedniego <DataFieldValue>, która należy do tego samego poziomu.

Odpowiedz

13

Jeśli DataFieldName jest unikalna w pliku:

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

Jeśli tak nie jest, a chcesz uzyskać tablicę z wszystkich pasujących DataFieldValues:

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

bardzo imponujące po przeczytaniu to czuję się zmuszony do pójścia i refaktoryzacji całego mojego kodu XmlSlurper (przekleństwo) –

+2

Czy to nie jest 'Lista'' NodeChildren'? Lepsze może być: '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

Witamy w Stackoverflow. Kiedy dostarczysz odpowiedź, dołącz tekst o tym, dlaczego twoja odpowiedź działa i czym różni się od odpowiedzi udzielonej wcześniej. – buczek