0

以下の例のような辞書を含む 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())
    }
}   
4

0 に答える 0