我有一個 xml 回應,我希望將其轉換為地圖,但某些 xml 節點是重復的,因此我希望將這些節點轉換為地圖串列。目前我正在使用這篇文章中建議的代碼: xmlslurper-to-return-all-xml-elements-into-a-map
提前致謝。
樣本 :
<head>test</head>
<tail>
<name>1</name>
<name>2</name>
</tail>
</body>
我想要以下地圖:
["head" : "test" , "tail" : [["name":"1"],["name":"2"]]]
uj5u.com熱心網友回復:
問題是這段代碼:
nodes.children().collectEntries {
[it.name(), it.childNodes() ? convertToMap(it) : it.text() ]
}
覆寫結果映射中的值。如果不做一些丑陋的黑客攻擊,我就無法找到一個優雅的解決方案。但這是我的解決方案:
final xml = """
<body>
<head>test</head>
<test>
<child>Child</child>
</test>
<tail>
<name>1</name>
<name>2</name>
<name>3</name>
<name>4</name>
<name>5</name>
</tail>
</body>
"""
def slurper = new XmlSlurper().parseText(xml)
println convertToMap(slurper)
def convertToMap(nodes) {
final list = []
final children = nodes.children().iterator()
while (children.hasNext()) {
final child = children.next()
list << [(child.name()): child.childNodes() ? convertToMap(child) : child.text()]
}
final keys = list.collect { it.keySet()[0].toString() }
if (keys.size() == keys.unique().size()) {
list.collectEntries { [(it.keySet()[0]): it[it.keySet()[0]]] }
} else {
list
}
}
我在這里所做的是,我首先將所有子項收集為地圖條目串列,所以它看起來像[[key1:value1], [key2:value2]]. 然后我遍歷這個中間結構并收集結果。
我希望它有助于前進。也許以后會有人來找你更好的解決方案,因為正如我所說,目前我還沒有找到任何優雅的方法來解決它。
uj5u.com熱心網友回復:
經過一番努力,我撰寫了這段代碼來解決我的問題,我嘗試使用 MultiValueMap ,但它正在將所有值轉換為串列,所以最后我不得不自己寫:
def xml = new groovy.xml.XmlSlurper().parse(response)
convertToMap(xml)
def convertToMap(nodes) {
def map = [:]
nodes?.children()?.each {
def key = it.name()
def value = it.childNodes() ? convertToMap(it) : it.text()
if (map.containsKey(key)) {
def currentValue = map.get(key)
if (currentValue instanceof List) {
currentValue.add(value)
} else {
map.put(key, [currentValue, value])
}
} else {
map.put(key, value)
}
}
map
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494017.html
標籤:xml 时髦的 xml 解析 转换器 xmlslurper
上一篇:如何正確使用chartjs格式?
