Groovy节点 vs 节点列表

6

我在向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

错误。
groovy.lang.MissingMethodException: No signature of method: groovy.util.NodeList.appendNode() is applicable for argument types: (java.lang.String, java.util.LinkedHashMap) values: [Role, [id:D]]
1个回答

12

这里的这一行:

def appSettings = root.'AppSettings'.find{it.@Name == "bar"}.'Roles'

返回的是一个NodeList(包含单个节点),因此您想在此列表的内容上调用appendNode,而不是在列表本身上调用它。

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

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

可以通过遍历列表并在每个元素上调用appendNode方法,或者通过以下方式实现:

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

如果列表有第一个元素(感谢 null-safe 运算符 ?),则会在列表的第一个元素上调用 appendNode


太棒了!谢谢Tim,我知道我错过了一些简单的东西。我希望我能多次投票支持它,因为在研究时我找不到任何相关信息。再次感谢。 - zuichuan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接