如何用groovy迭代xml节点

mi7gmzs6  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(117)

我尝试用groovy迭代xml文件来获取一些值,我发现很多人都有同样的问题,但是他们的解决方案对我不起作用,或者太复杂了,我不是一个groovy开发人员,所以我需要一个我可以实现的防弹解决方案。
基本上,我有一个XML响应文件,看起来像这样:(看起来很糟糕,但这就是我得到的)

<Body>
 <head>
  <Details>

   <items>
    <item>
     <AttrName>City</AttrName>
     <AttrValue>Rome</AttrValue>
    </item>

    <item>
     <AttrName>Street</AttrName>
     <AttrValue>Via_del_Corso</AttrValue>
    </item>

    <item>
     <AttrName>Number</AttrName>
     <AttrValue>34</AttrValue>
    </item>

   </items>
 
  </Details>
 </head>
</Body>

我已经尝试过这个解决方案,我发现在这里StackOverflow打印的值:

def envelope = new XmlSlurper().parseText("the xml above")

envelope.Body.head.Details.items.item.each(item -> println( "${tag.name}")  item.children().each {tag -> println( "  ${tag.name()}: ${tag.text()}")} }

我得到的最好的结果就是

ConsoleScript11$_run_closure1$_closure2@2bfec433
ConsoleScript11$_run_closure1$_closure2@70eb8de3
ConsoleScript11$_run_closure1$_closure2@7c0da10
Result: CityRomeStreetVia_del_CorsoNumber34

我还可以删除第一个println之后的所有内容,以及它内部的所有内容,结果是相同的
我在这里的主要目标不是打印这些值,而是从XML中推断出这些值,并将它们保存为字符串变量...我知道使用字符串不是最佳实践,但我现在只需要理解一下。

y0u0uwnf

y0u0uwnf1#

您的代码有两个缺陷:
1.使用envelope.Body,您将找不到任何内容
1.如果修复第1个问题,您将遇到each(item -> println( "${tag.name}")的多个编译错误。此处使用(而不是{,并且您使用了未定义的tag变量。
工作代码如下所示:

import groovy.xml.*

def xmlBody = new XmlSlurper().parseText '''\
<Body>
 <head>
  <Details>

   <items>
    <item>
     <AttrName>City</AttrName>
     <AttrValue>Rome</AttrValue>
    </item>

    <item>
     <AttrName>Street</AttrName>
     <AttrValue>Via_del_Corso</AttrValue>
    </item>

    <item>
     <AttrName>Number</AttrName>
     <AttrValue>34</AttrValue>
    </item>

   </items>
 
  </Details>
 </head>
</Body>'''

xmlBody.head.Details.items.item.children().each {tag ->
  println( "  ${tag.name()}: ${tag.text()}")
}

并打印:

AttrName: City
  AttrValue: Rome
  AttrName: Street
  AttrValue: Via_del_Corso
  AttrName: Number
  AttrValue: 34

相关问题