以下の例のような辞書を含む XML ファイルがあります。リンクされたIDが実際の値で埋められるように、GroovyでこのXMLを変換しようとしています。
<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>
< car_id > & < specs_id > 要素が実際の要素に置き換えられるように、XML 全体を変換する最速の方法は何ですか。以下のようなもの:
<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 を使用することを考えていましたが、XSLT に関する知識があまりないため、他の提案があれば素晴らしいと思います。XmlSlurper も使用しましたが、私の場合は遅すぎると思います。
編集:
XmlSlurper よりも高速なので、XmlParser を使用しました。
まず、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())
}
}