2012-08-08 111 views
4

我很难在xml结构中添加更深的节点。我缺少和node和nodeList之间的东西。任何帮助将不胜感激。Groovy节点与节点列表

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{[email protected] == "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]] 

回答

8

这里这条线:

def appSettings = root.'AppSettings'.find{[email protected] == "bar"}.'Roles' 

正在返回你的NodeList(包含一个结点),所以你要调用这个列表中的内容appendNode ,而不是名单本身。

这是可以做到无论是:

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

,它将调用appendNode列表中的每一个元素上,或者通过:

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

,它将调用appendNode列表的第一个元素(如果第一个元素归功于无效运算符?)。

+0

太棒了!谢谢Tim,我知道我错过了一些简单的东西。我希望我可以多次投票,因为在研究过程中我找不到任何东西。再次感谢。 – zuichuan 2012-08-09 13:19:13