我有一个包含字典的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())
}
}