Groovy:Xml:如何在单个循环中读取解析的xml字符串文本

时间:2014-05-09 06:49:55

标签: xml grails groovy xmldocument

包含名为<Name>的子标记的xml字符串响应,响应可能包含一个或多个<Name>标记,如下所示,

案例1

String Xml = <School> <Student> <Name>Akhil</Name> <Name>Nikhil</Name> <Name>Kiran</Name> </Student> <School>

案例2 字符串Xml = <School> <Student> <Name>Akhil</Name> </Student> <School>

String parsedXml =  new XmlParser(false,false).parseText(Xml)

如果使用以下语句

获取第一个<Name>标记内的第1个值
Case 1
     String name = parsedXml.Student.Name[0].text()

如果使用以下语句

获取<Name>标记内的2值
Case 2
     String name = parsedXml.Student.Name.text()

那么我怎样才能得到value Akhil ie:从两个案例中的第一个标签使用一个语句

String name = parsedXml.Student.Name[0].text()

如果我在案例2中使用此语句:那么错误为空

2 个答案:

答案 0 :(得分:2)

您可以使用spread-dot运算符。它将访问具有给定名称的所有子节点。它会返回一个列表,如果你有不规则的xml结构,里面有两个标签盒,那么你可以将它弄平。

String xml ="""<School>
  <Student>
    <Name>Akhil</Name>
    <Name>Nikhil</Name>
    <Name>Kiran</Name>
  </Student>
  <Student>
    <Name>Akhil2</Name>
  </Student>
</School>"""

def res = new XmlParser().parseText(xml).Student*.Name.flatten()*.text()
println(res) //[Akhil, Nikhil, Kiran, Akhil2]

修改

这一行会给你[Akhil,Akhil2]作为输出。

new XmlParser().parseText(xml).Student*.Name.collect { it[0] }*.text()

答案 1 :(得分:0)

这样你总会得到一个清单:

def xml1 = '''<School>
                    <Student>
                        <Name>Akhil</Name>
                        <Name>Nikhil</Name>
                        <Name>Kiran</Name>
                   </Student>
             </School>'''

def xml2 = '''<School>
                    <Student>
                        <Name>Akhil</Name>
                    </Student>
             </School>'''
def xml1p = new XmlParser(false,false).parseText(xml1)
def xml2p = new XmlParser(false,false).parseText(xml2)

println xml1p.Student.Name*.text().first() //or [0]
println xml2p.Student.Name*.text().first() //or [0]