题
例如,我有以下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>
'''
我想要开车<!>“Royale <!>”;直到第一个,并在汽车<!> HSV Maloo <!>“之后插入一辆新车,结果将是:
'''
<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时遇到了问题。然后我意识到通过询问root的所有内容返回的NodeList是<!>“car <!>”;通过询问root的孩子,孩子与你得到的名单不同。尽管在这种情况下它们碰巧是相同的列表,但如果有非<!>“car <!>”,它们并不总是如此。孩子根源。因此,重新记录从查询返回的汽车列表不会影响初始列表。
这是一个附加和重新排序的解决方案:
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,也许你没注意到我想要'''在汽车后面插入一辆新车<!> HSV Maloo <!>';''',所以我将你的代码修改为:
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;手工波GT <!>; 这些不是您寻求的密码 LT <!>; /手波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,当我测试这个而不是root ... yikes。不隶属于 StackOverflow