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 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]]

最佳答案

这条线在这里:

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

正在返回一个 NodeList(包含一个节点),所以你想调用 appendNode列表的内容,而不是列表本身。

这可以通过以下任一方式完成:
appSettings*.appendNode('Role', [id: 'D'])

这将调用 appendNode在列表的每个元素上,或通过:
appSettings[0]?.appendNode('Role', [id: 'D'])

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

关于Groovy 节点与节点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874781/

相关文章:

multithreading - 在 Groovy 中加入线程

Java,在开发过程中使用Groovy(Grails)只是为了能够测试代码而无需重新编译?

groovy - 在构建过程中在源中设置 "hard-coded"标志

groovy - 抓取葡萄时出错... Unresolved 依赖关系...未找到

java - 如何将Groovy类的实例分配给Java类中的变量

jenkins - groovy 捕获标准输出最后一行

Android Studio 无法加载类 'org.codehaus.groovy.runtime.typehandling.ShortTypeHandling'

google-app-engine - grails 1.3.1执行脚本GenerateViews时出错:

java - 将 Spock 测试框架集成到 Eclipse Neon2 v4.6.2

java - java或groovy中的字符串格式负数减号(无括号)