0

我有一个包含字典的 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 的最快方法是什么,以便将 <car_id> 和 <specs_id> 元素替换为实际元素。Somehting 如下所示:

<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=1,ID=2,ID=3,...)给它们一个 ID,这是一种更合适的方法,然后将 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())
    }
}   
4

0 回答 0