質問
たとえば、次のxmlドキュメントがあります:
def CAR_RECORDS = '''
<records>
<car name='HSV Maloo' make='Holden' year='2006'/>
<car name='P50' make='Peel' year='1962'/>
<car name='Royale' make='Bugatti' year='1931'/>
</records>
'''
そして車を動かしたい<!> quot; Royale <!> quot;最初の1つまで、car <!> quot; HSV Maloo <!> quot;の直後に新しい車を挿入すると、結果は次のようになります。
'''
<records>
<car name='Royale' make='Bugatti' year='1931'/>
<car name='HSV Maloo' make='Holden' year='2006'/>
<car name='My New Car' make='Peel' year='1962'/>
<car name='P50' make='Peel' year='1962'/>
</records>
'''
Groovyでそれを行う方法コメントを歓迎します。
解決
私は同様の方法でdanbに行きましたが、実際に結果のXMLを印刷するときに問題に遭遇しました。次に、ルートのすべてに<!> quot; car <!> quot;を要求することで返されたNodeListに気付きました。 childrenは、ルートの子を要求するだけで得られるリストとは異なります。この場合、たまたま同じリストになっていますが、<!> quot; car <!> quotがない場合は常にそうとは限りません。ルートの下の子供。このため、クエリから戻ってくる車のリストを変更しても、最初のリストには影響しません。
追加と並べ替えを行うソリューションは次のとおりです。
def CAR_RECORDS = '''
<records>
<car name='HSV Maloo' make='Holden' year='2006'/>
<car name='P50' make='Peel' year='1962'/>
<car name='Royale' make='Bugatti' year='1931'/>
</records>
'''
def carRecords = new XmlParser().parseText(CAR_RECORDS)
def cars = carRecords.children()
def royale = cars.find { it.@name == 'Royale' }
cars.remove(royale)
cars.add(0, royale)
def newCar = new Node(carRecords, 'car', [name:'My New Car', make:'Peel', year:'1962'])
assert ["Royale", "HSV Maloo", "P50", "My New Car"] == carRecords.car*.@name
new XmlNodePrinter().print(carRecords)
適切に順序付けられた車でのアサーションがパスし、XmlNodePrinterが出力します:
<records>
<car year="1931" make="Bugatti" name="Royale"/>
<car year="2006" make="Holden" name="HSV Maloo"/>
<car year="1962" make="Peel" name="P50"/>
<car name="My New Car" make="Peel" year="1962"/>
</records>
他のヒント
ted、多分あなたは私が '' 'car <!> quot; HSV Maloo <!> quot;'の直後に新しい車を挿入したいのに気づかなかったので、コードを次のように変更します:
def newCar = new Node(null, 'car', [name:'My New Car', make:'Peel', year:'1962'])
cars.add(2, newCar)
new XmlNodePrinter().print(carRecords)
今、適切な順序で動作します! danb <!> ampに感謝します。テッド。
<records>
<car year="1931" make="Bugatti" name="Royale"/>
<car year="2006" make="Holden" name="HSV Maloo"/>
<car name="My New Car" make="Peel" year="1962"/>
<car year="1962" make="Peel" name="P50"/>
</records>
<!> lt; hand-wave <!> gt; これらはあなたが探しているcodzではありません <!> lt; / hand-wave <!> gt;
Node root = new XmlParser().parseText(CAR_RECORDS)
NodeList carNodes = root.car
Node royale = carNodes[2]
carNodes.remove(royale)
carNodes.add(0, royale)
carNodes.add(2, new Node(root, 'car', [name:'My New Card', make:'Peel', year:'1962']))
新しいノードを作成するよりスマートな方法があるかどうかはわかりませんが...それは私のために動作します。
編集:ええと...ありがとうございます...私は怠け者になり、ルートの代わりにこれをテストしたときにcarNodesを出力していました... yikes。