2011-12-07 13 views
1

私はこのようなXMLのresponde取得しています取得:Groovyの解析XMLと価値が

<response> 
<lst name="responseHeader"> 
<int name="status">0</int> 
<int name="QTime">272</int> 
<lst name="params"> 
<str name="indent">on</str> 
<str name="start">0</str> 
<str name="q">roger federer</str> 
<str name="version">2.2</str> 
<str name="rows">10</str> 
</lst> 
</lst> 
<result name="response" numFound="29327" start="0"> 
<doc> 
<str name="id">135350</str> 
<int name="revision">723055</int> 
<date name="timestamp">2005-08-21T22:34:05Z</date> 
<str name="title">Federer</str> 
<str name="titleText">Federer</str> 
<str name="user">Indech</str> 
<str name="userId">3073</str> 
</doc> 
<doc>...</doc> 
... 
<doc>...</doc> 
</result> 
</response> 

と私はここに3つのことを格納したい:

xml = grails.converters.XML.parse(new URL('http://...)) 

XMLは次のようである

<int name="QTime">272</int> 
<str name="q">roger federer</str> 
<result name="response" numFound="29327" start="0"> 

私の出力は次のようにWUD:

def one = '272' 
def two = 'roger federer' 
def three = '29327' 

どうすれば達成できますか?私はこれについていくつかの助けに感謝します。 Prettybly Groovyで、Javaではありません。

答えて

4

一つかもしれませんこれを行う方法:

xml = grails.converters.XML.parse(new URL('http://...)) 

def (one, two, three) = xml.depthFirst().findAll { 
    [email protected] == 'QTime' || [email protected] == 'q' || [email protected] == 'response' 
}.with { a, b, c -> 
    [ a.text(), b.text(), [email protected] ] 
} 

println one 
println two 
println three 

しかし、それは、XMLビーイングn個の第2ビットで必要な順序で物事を返すために、あなたがfindAllのために示したために少し依存だ

さらに簡単なアプローチは次のとおりです。

def one = xml.lst.int.find { [email protected] == 'QTime' }.text() 
def two = xml.lst.lst.str.find { [email protected] == 'q' }.text() 
def three = [email protected] 

println one 
println two 
println three