【发布时间】:2014-10-23 00:16:08
【问题描述】:
我正在尝试动态生成以下 XML。它是一个元素列表(它也可以有子列表和子子列表,等等)。
<root>
<Fault>
<Code>100</Code>
<Type>USER</Type>
<DetailList>
<DetailText>Incorrect name</DetailText>
<DetailText>Incorrect ID</DetailText>
</DetailList>
<severity>ABORT</severity>
</Fault>
<Fault>
<Code>200</Code>
<Type>SYSTEM</Type>
<DetailList>
<DetailText>Invalid DB</DetailText>
<DetailText>Invalid Access</DetailText>
</DetailList>
<severity>CRITICAL</severity>
</Fault>
</root>
我一次只能访问一个行项目的数据源,所以我想我需要将数据存储在某种地图中。我开始创建一个动态映射来保存可以写为 XML 的项目列表,如 SO answer 中提供的那样。
这是我期望实现的结构 -
def map = [
["Fault": [
"Code":"100",
"Type":"USER",
"DetailList" : [
["DetailText":"Incorrect name"],
["DetailText":"Incorrect ID"]
],
"severity":"ABORT"
]],
["Fault": [
"Code":"200",
"Type":"SYSTEM",
"DetailList" : [
["DetailText":"Invalid DB"],
["DetailText":"Invalid Access"]
],
"severity":"CRITICAL"
]]
]
在运行时,我将动态获取这些值,所以现在这是我一直在尝试按上述方式工作的部分 -
String root = "Fault"
String item1 = "Code"
String item2 = "Type"
String nextLevel = "DetailList"
String levelItem = "DetailText"
String innerItem1 = "Incorrect name"
String innerItem2 = "Incorrect ID"
def dummyMap = { [:].withDefault{ owner.call() } }()
def map = { [:].withDefault{ owner.call() } }()
map.put(root, [:])
map."$root"[item1] = "100"
map."$root"[item2] = "USER"
map."$root"["$nextLevel"] = [:]
x = map."$root"["$nextLevel"]
x."$levelItem" = innerItem1
这就是我卡住的地方。我无法弄清楚如何在同一级别的列表中添加第二项,而不覆盖第一项。
我对 Groovy 完全陌生,所以我可能没有以最好的方式来做这件事。如果有任何其他方法可以实现生成的 XML,我很乐意根据您的建议工作。
【问题讨论】:
-
为什么不使用
[XMLSlurper](http://groovy.codehaus.org/api/groovy/util/XmlSlurper.html),它会给你一个属性,比如访问xml(就像使用地图一样)? -
另外,“我一次只能访问一个行项目”是什么意思。它是巨大的还是你真的每个例如只得到一条线? methodcall又不能累积?还是只是被换行符和列表分割?