对于<TestSuites>中的每个XML节点<suite>,如何使用Groovy获取<suite> <name>的文本值

时间:2019-10-02 01:11:15

标签: xml groovy tree xml-parsing

我在Groovy中有以下代码,在该代码中,我按照以下结构以XML进行了解析:

def xmlString = '''<?xml version="1.0" encoding="UTF-8"?>
<result plugin="junit@1.28">
  <duration>8711.001</duration>
  <keepLongStdio>false</keepLongStdio>
  <build>null</build>
  <suites>
    <suite>
      <name>JavaScript Tests</name>
      <duration>5.331</duration>
      <timestamp>2019-10-01T20:24:36Z</timestamp>
      <id>0</id>
    </suite>
    <suite>
      <name>Whatever</name>
      <duration>5.331</duration>
      <timestamp>2019-10-01T20:24:36Z</timestamp>
      <id>2</id>
    </suite>
  </suites>
</result>'''

def masterXml = new XmlParser().parseText(xmlString)
masterXml.suites​.'*'.each{ suite ->
  def suiteName = suite
  println "GIVE ME SUITE NAME REEEEEEEEEEEEE: ${suiteName}"
}​

我正在尝试遍历<suite>中的每个<suites>,并为每个套件获取运行的测试套件的<name>。我认为这将是非常容易的,但是显然groovy对于这是什么类型的集合都使用一些特殊的语法,至少对我而言,这实际上非常困难。

我竭尽全力在此处阅读文档:https://groovy-lang.org/processing-xml.html#_simply_traversing_the_tree

并尝试以他们的示例为基础,但是我真的无法做任何事情,只是给我我想要的。

我为此在此处制作了一个普通的控制台:https://groovyconsole.appspot.com/script/5074191896281088

而且我已经花了好几个小时试图找出答案。请发送帮助。

1 个答案:

答案 0 :(得分:1)

masterXml.suites之后,您立即有一个代码63的非打印字符。

您可以通过以下方式看到它:

println "suites​.'*'".bytes // [115, 117, 105, 116, 101, 115, 63, 46, 39, 42, 39]

您还需要获取name.text()。工作版本(我用非印刷字符重新输入了该行):

def masterXml = new XmlParser().parseText(xmlString)
masterXml.suites.'*'.each{ suite ->
  def suiteName = suite.name.text()
  println "GIVE ME SUITE NAME REEEEEEEEEEEEE: ${suiteName}"
}​

编辑:代码为63的字符应为问号。哪个应该是?.运算符,所以应该是有效的Groovy。某些地方出现了一些编码问题。有趣的是,这给出了完全相同的字节序列:

println "suites?.'*'".bytes // [115, 117, 105, 116, 101, 115, 63, 46, 39, 42, 39]