Groovy:如何在使用XMLSlurper()读入的XML元素列表的开头插入节点
我可能遗漏了一些明显的东西,因为我是Groovy的新手,但我已经搜索过了,但还没有找到我想要的东西。我有一个测试类,我正在阅读一些XML;我想在一系列元素的开头插入一个元素。我已经知道了如何替换第一个元素,我已经知道了如何将一个节点附加到列表的末尾,但是我似乎不知道如何在列表的开头插入一个元素(或者理想情况下,任意位置) 例如:Groovy:如何在使用XMLSlurper()读入的XML元素列表的开头插入节点,xml,groovy,Xml,Groovy,我可能遗漏了一些明显的东西,因为我是Groovy的新手,但我已经搜索过了,但还没有找到我想要的东西。我有一个测试类,我正在阅读一些XML;我想在一系列元素的开头插入一个元素。我已经知道了如何替换第一个元素,我已经知道了如何将一个节点附加到列表的末尾,但是我似乎不知道如何在列表的开头插入一个元素(或者理想情况下,任意位置) 例如: @Test void foo() { def xml = """<container> <listoft
@Test
void foo()
{
def xml = """<container>
<listofthings>
<thing id="100" name="foo"/>
</listofthings>
</container>"""
def root = new XmlSlurper().parseText(xml)
root.listofthings.thing[0].replaceNode ( { thing(id:101, name:'bar') })
root.listofthings.appendNode ( { thing(id:102, name:'baz') })
def outputBuilder = new groovy.xml.StreamingMarkupBuilder()
String result = outputBuilder.bind { mkp.yield root }
print result
}
@测试
void foo()
{
def xml=“”
"""
def root=new XmlSlurper().parseText(xml)
root.listofthings.thing[0].replaceNode({thing(id:101,名称:'bar')})
root.listofthings.appendNode({thing(id:102,名称:'baz')})
def outputBuilder=new groovy.xml.StreamingMarkupBuilder()
字符串结果=outputBuilder.bind{mkp.yield root}
打印结果
}
这将产生:
<container>
<listofthings>
<thing id='101' name='bar'/>
<thing id='102' name='baz'/>
</listofthings>
</container>
我真正想要的是在listofthings的开头插入一个节点,即替换对replaceNode的调用,该调用将在id为100的对象之前插入id为101的对象。如果我有一个较长的列表,在第n个元素之后插入一个节点,我也会很高兴
(顺便问一句,有没有办法以更可读的格式获得输出?StreamingMarkupBuilder的输出最终都是一行文本;为了清晰起见,我重新格式化了它)
编辑:我使用的是1.7.5,它与Eclipse捆绑在一起,如果有必要的话。一种方法是将
元素从原始xml中提取到一个列表中,操作该列表,然后用这个新列表重建文档:
// function to take a single line xml output, and make it pretty
String renderFormattedXml( String xml ){
def stringWriter = new StringWriter()
def node = new XmlParser().parseText( xml )
new XmlNodePrinter( new PrintWriter( stringWriter ) ).print( node )
stringWriter.toString()
}
def xml = """<container>
<listofthings>
<thing id="100" name="foo"/>
</listofthings>
</container>"""
def root = new XmlSlurper().parseText(xml)
def things = root.listofthings*.thing
// Insert one at pos 0
things.add( 0, { thing( id:98, name:'tim' ) } )
// And one at the end
things.add( { thing( id:999, name:'zebra' ) } )
// And one at position 1
things.add( 1, { thing( id:99, name:'groovy' ) } )
def outputBuilder = new groovy.xml.StreamingMarkupBuilder()
String result = outputBuilder.bind {
container {
listofthings {
mkp.yield things
}
}
}
println renderFormattedXml( result )
//函数获取单行xml输出,并使其美观
字符串呈现格式DXML(字符串xml){
def stringWriter=新stringWriter()
def node=new XmlParser().parseText(xml)
新的XmlNodePrinter(新的PrintWriter(stringWriter)).print(节点)
stringWriter.toString()
}
def xml=“”
"""
def root=new XmlSlurper().parseText(xml)
def things=root.listofthings*.thing
//在位置0处插入一个
添加(0,{thing(id:98,name:'tim')})
//最后一个
添加({thing(id:999,name:'zebra'))
//一个在位置1
add(1,{thing(id:99,名称:'groovy')})
def outputBuilder=new groovy.xml.StreamingMarkupBuilder()
字符串结果=outputBuilder.bind{
容器{
物品清单{
mkp.放弃一切
}
}
}
println renderFormattedXml(结果)
哪张照片
<container>
<listofthings>
<thing id="98" name="tim"/>
<thing id="99" name="groovy"/>
<thing id="100" name="foo"/>
<thing id="999" name="zebra"/>
</listofthings>
</container>
太棒了!非常感谢你!当我尝试运行上面的代码时,我在输出中得到了颠倒的name=foo和id=100。为什么?