2

我有一个特定的需求,我正在解析一个文件,然后我需要根据我解析的数据创建一个 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 的循环开始并获取第一个表(患者)。然后我会遍历 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)       
            }
        }
    }
}

我不确定这是否可行,如果不是,我只想有人告诉我,这样我就不会再浪费时间了。如果是,我将不胜感激如何做到这一点的一个例子。

谢谢 - 卡尔

4

1 回答 1

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>
于 2013-08-08T20:03:01.997 回答