2011-11-30 33 views
11

Hãy nói rằng có cấu trúc XML sau:XmlSlurper Groovy: Tìm các yếu tố trong cấu trúc 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> 

Sử dụng Groovy của XmlSlurper tôi cần phải làm như sau:

Bắt đầu từ Data thấy rằng yếu tố, trong đó có các giá trị Field #1 trong phần tử <DataFieldName>. Nếu tìm thấy sau đó nhận được giá trị của <DataFieldValue> tương ứng thuộc cùng cấp.

Trả lời

13

Nếu DataFieldName là duy nhất trong một tập tin:

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

Nếu nó không phải là, và bạn muốn để có được một mảng với tất cả DataFieldValues ​​phù hợp:

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

rất ấn tượng, sau khi đọc điều này tôi cảm thấy bắt buộc phải đi và refactor tất cả các mã XmlSlurper của tôi (lời nguyền bạn) –

+2

Đó không phải là một 'List' của' NodeChildren'? Tốt hơn có thể là: 'new XmlSlurper(). ParseText (xml) .DataFieldText.findAll {it.DataFieldName.text() == 'Trường # 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

Chào mừng bạn đến Stackoverflow. Khi bạn cung cấp câu trả lời, vui lòng bao gồm một số nội dung về lý do câu trả lời của bạn hoạt động và cách nó khác với giải pháp được trả lời trước đó. – buczek

Các vấn đề liên quan