Groovy节点与节点列表

Groovy节点与节点列表,groovy,Groovy,我很难在xml结构中添加更深层次的节点。我缺少与节点和节点列表之间的内容。任何帮助都将不胜感激 def xml='''<Root id="example" version="1" archived="false"> <Item name="one" value="test"/> <Item name="two" value="test2"/> <Item name="three" value="test3"/> <AppSettings Na

我很难在xml结构中添加更深层次的节点。我缺少与节点和节点列表之间的内容。任何帮助都将不胜感激

def xml='''<Root id="example" version="1" archived="false">
<Item name="one" value="test"/>
<Item name="two" value="test2"/>
<Item name="three" value="test3"/>
<AppSettings Name="foo" Id="foo1">
    <roles>foo</roles>
</AppSettings>
<AppSettings Name="bar" Id="bar1">
    <Item name="blue" value=""/>
    <Item name="green" value=""/>
    <Item name="yellow" value=""/>
    <Roles>
        <Role id="A"/>
        <Role id="B"/>
        <Role id="C"/>
    </Roles>
</AppSettings>
</Root>'''

root = new XmlParser().parseText(xml)
def appSettings = root.'AppSettings'.find{it.@Name == "bar"}.'Roles'
appSettings.appendNode('Role', [id: 'D'])


def writer = new StringWriter()
def printer = new XmlNodePrinter(new PrintWriter(writer))
printer.preserveWhitespace = true
printer.print(root)
String result = writer.toString()

println result
这一行在这里:

def appSettings = root.'AppSettings'.find{it.@Name == "bar"}.'Roles'
正在返回一个节点列表(包含一个节点),因此您希望对该列表的内容而不是列表本身调用
appendNode

这可以通过以下方式实现:

appSettings*.appendNode('Role', [id: 'D'])
它将在列表的每个元素上调用
appendNode
,或通过以下方式调用:

appSettings[0]?.appendNode('Role', [id: 'D'])

它将在列表的第一个元素上调用
appendNode
(如果由于空安全运算符
,有第一个元素的话)。

太棒了!谢谢蒂姆,我知道我遗漏了一些简单的东西。我希望我能投票支持这几次,因为我在研究的时候找不到任何东西。再次感谢。
appSettings[0]?.appendNode('Role', [id: 'D'])