我有一个特殊的需要,我正在解析一个文件,然后我需要根据我解析的数据创建一个xml文件。
例如,我创建了两个地图(tableMap,fieldMap)。
tableMap: [1:{Table=patient}, 2:{Table=provider}]
fieldMap: [1:{Table=patient, Field=id}, 2:{Table=patient, Field=gender},
3:{Table=provider, Field=id}, 4:{Table=provider, Field=name}]
使用Groovy我将从tableMap开始循环并获取第一个Table(患者)。然后我将遍历fieldMap以获取与Table匹配的字段。
下面是一些示例代码,演示了如何使用“value.Table(tag:'01',value.Field)”动态创建节点和元素名称“:
tableMap.each
{ tKey, tValue ->
// Find the Table value in the fieldMap that matches the value
// in the tableMap
def tableFields = fieldMap.findAll { fKey, fValue ->
fValue.Table == tValue.Table
}
tValue.Table = []
// Create an XML file with all the tables and field names collected.
xsdToXml.root()
{
// dynamically create xml nodes
tableFields.each
{ key, value ->
value.Table + '()' {
value.Table(tag:'01',value.Field)
}
}
}
}
我不确定这是否可能,如果不是,我只是想让别人告诉我,所以我不再浪费时间了。如果是的话,我会很感激如何做到这一点。
谢谢 - 卡尔
答案 0 :(得分:3)
是的,你没有说出你希望输出XML看起来像什么,而是采用fieldMap(你不需要tableMap):
def fieldMap = [ 1:[ Table:'patient', Field:'id' ],
2:[ Table:'patient', Field:'gender' ],
3:[ Table:'provider', Field:'id' ],
4:[ Table:'provider', Field:'name' ] ]
你可以这样做:
import groovy.xml.*
String x = new StreamingMarkupBuilder().bind {
xml {
fieldMap.values().groupBy { it.Table }.each { table, values ->
"${table}" {
values.each {
"${it.Field}"()
}
}
}
}
}
生成xml:
<xml>
<patient>
<id/>
<gender/>
</patient>
<provider>
<id/>
<name/>
</provider>
</xml>