Для каждого узла XML <suite>в <TestSuites>как я могу получить текстовое значение <suite><name>, используя Groovy - PullRequest
0 голосов
/ 02 октября 2019

У меня есть следующий код в 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 Ответ

1 голос
/ 02 октября 2019

У вас есть какой-нибудь непечатаемый символ с кодом 63 сразу после masterXml.suites.

Вы можете увидеть это с помощью:

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]
...