【问题标题】:From an XML String to a dynamic "LIST" Output从 XML 字符串到动态“列表”输出
【发布时间】:2021-08-03 00:53:45
【问题描述】:

下午好, 我正在寻找关于这个的提示。最后,我正在接近我想要的输出。

import groovy.xml.XmlSlurper

String XML = '''
    <results>
  <result>
    <Firstname>Marco</Firstname>
    <Surname>Alves</Surname>
    <Age>33</Age>
    <Address>Lisbon</Address>
    <ALIAS>Valentino Rossi</ALIAS>
  </result>
  <result>
    <Firstname>André</Firstname>
    <Surname>Vieira</Surname>
    <Age>31</Age>
    <Address>Lisbon</Address>
  </result>
  <result>
    <FirstName>Pedro</FirstName>
    <Surname>Kuclo</Surname>
  </result>
  <result>
    <Address>Lisbon</Address>
    <Surname>Kuclo</Surname>
  </result>
</results>
'''
         
def people = new XmlSlurper().parseText(XML)
people.result.findAll { m ->
    m.Firstname.toString().contains("Marco")
}.each { m ->
    println(m)
}

这是当前的输出:

MarcoAlves33LisbonValentino Rossi

谁有实现这个输出的想法?

List { "Marco", "Alves", "33", "Lisbon", "Valentino Rossi }

输出必须是动态的,比如说,没有定义“{m.Firstname} \n${m.Surname}”

到目前为止我尝试了什么:

// println("\n${m.Firstname} \n${m.Surname} \n${m.Address} \n${m.age}\n${m.ALIAS}")

但是这样我必须定义输出并且我希望它是动态的。

【问题讨论】:

  • 要输出 JSON 吗?还是List 是输出的一部分?
  • 你好,我亲爱的@cfrick JSON 会很好用。

标签: javascript java xml groovy


【解决方案1】:

如果您想返回包含特定属性或以不同顺序排列的属性的列表,您可以使用 collect 方法为每个匹配条目收集您认为合适的元素并将其作为列表返回:

String XML = '''
    <results>
  <result>
    <Firstname>Marco</Firstname>
    <Surname>Alves</Surname>
    <Age>33</Age>
    <Address>Lisbon</Address>
    <ALIAS>Valentino Rossi</ALIAS>
  </result>
  <result>
    <Firstname>André</Firstname>
    <Surname>Vieira</Surname>
    <Age>31</Age>
    <Address>Lisbon</Address>
  </result>
  <result>
    <FirstName>Pedro</FirstName>
    <Surname>Kuclo</Surname>
  </result>
  <result>
    <Address>Lisbon</Address>
    <Surname>Kuclo</Surname>
  </result>  
</results>
'''

def people = new XmlSlurper().parseText(XML)
def results = people.result.findAll { m ->
    m.Firstname.toString().contains("Marco")
}.collect{ it ->
   [it.Firstname, it.Surname, it.Age, it.Address, it.ALIAS]
}

println results

生成输出:

[[马尔科,阿尔维斯,33岁,里斯本,瓦伦蒂诺·罗西]]

您可以轻松地修改收集的内容以获得您想要的结果。

如果您想要获取匹配结果并将每个结果(包括结果的所有属性)转换为 Json,您可以这样做:

def people = new XmlSlurper().parseText(XML)
def results = people.result.findAll { person ->
    person.Firstname.toString().contains("Marco")
}.collect{ result -> result.children().collectEntries{ child -> [(child.name()) , child.text()]} }

results = groovy.json.JsonOutput.toJson(results)
println results

这将产生这些结果:

[
  {
    "Firstname":"Marco",
    "Surname":"Alves",
    "Age":"33",
    "Address":"Lisbon",
    "ALIAS":"Valentino Rossi"
  }
]

【讨论】:

  • 所以不是您希望以特定方式排序,只是将每个结果的所有字段与匹配名称添加到列表中的结果中?
  • 您好! @pczeus ` [ { "Firstname":"Marco", "Surname":"Alves", "Age":"33", "Address":"Lisbon", "ALIAS":"Valentino Rossi" } ] ` 你可以将输出修改为:` [ { "Marco", "Alves", "33", "Lisbon", "Valentino Rossi" } ] ` 有可能吗?提前谢谢你:
  • 你要求的不再是 JSON,它应该是 name:value 对格式。现在您要的是一个列表列表,其中每个嵌套列表都包含值的字符串。无论哪种方式,您都可以根据您认为合适的方式稍微修改上面的代码以轻松完成。
  • 我设法获得了结果。但是你的帮助就是一切,明天我会给你看代码。非常感谢朋友! @pczeus
  • Hello @pczeus ` }.collect { result -> result.children().collectMany { child -> [child.text()] } } //这将只收集孩子的名字,到获取像“名字”这样的子文本:Marco - 使用:child.name()。这两个参数都可以使用。 println(results)` 我刚刚添加了一个小改动,它正在工作!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多