使用Groovy转换包含字典的XML

时间:2013-10-22 15:42:37

标签: xml xslt dictionary groovy

我有一个包含字典的XML文件,如下例所示。我正在尝试在Groovy中转换此XML,以便使用实际值填充链接的ID。

<root>
    <dictionary>
        <list_car>
            <car_name>Ferrari</car_name>
            <car_color>red</car_color>
            <specs_id>0</specs_id>
        </list_car>
        <list_car>
            <car_name>Porsche</car_name>
            <car_color>black</car_color>
            <specs_id>0</specs_id>
        </list_car>
        <list_specs>
            <pk>570</pk>
            <engine>4,5 l</engine>
        </list_specs>
    </dictionary>
    <persons>
        <person>
            <name>James</name>
            <car_id>0</car_id>
        </person>
        <person>
             <name>John</name>
             <car_id>1</car_id>
        </person>
    </persons>
</root>

转换整个XML的最快方法是什么,以便&lt; car_id&gt; &安培; &LT; specs_id&gt;元素被实际元素替换。如下所示:

<person>
    <name>John</name>
    <car>
        <car_name>Porsche</car_name>
        <car_color>black</car_color>
        <specs>        
            <pk>570</pk>
            <engine>4,5 l</engine>
        </specs>
    </car>
</person>

我原来的XML非常复杂,有点大(1MB)。 我正在考虑使用XSLT,但我对它的了解不是那么好,所以其他建议会很棒。我也和XmlSlurper一起工作,但我认为这种情况太慢了。

编辑:

我使用XmlParser,因为它比XmlSlurper快。

首先,我遍历LIST_CAR元素并根据位置给它们一个id(ID = 1,ID = 2,ID = 3,...)这是一种更合适的方式,然后将ID链接到位置字典元素。

<list_car car_id="0">
        <car_name>Ferrari</car_name>
        <car_color>red</car_color>
        <specs_id>0</specs_id>
    </list_car>

然后我遍历PERSON元素,使用node.Remove(...)删除CAR_ID元素 之后,我通过使用LIST_CAR字典元素进行内部循环来亲自从LIST_CAR添加实际数据

root.persons.each { person ->

    def carId = person.car_id.text()

    def nodeToDel= person.car_id.find{ it.name() == "car_id" }

    root.dictionary.list_car.findAll{ it.@car_id == carId.toInteger() }.each { s ->

        def parent = nodeToDel.parent()
        parent.remove(nodeToDel)
        parent.appendNode('CAR',s.value())
    }
}   

0 个答案:

没有答案