gpt4 book ai didi

xml - Groovy:如何在使用 XMLSlurper() 读取的 XML 元素列表的开头插入节点

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:40 24 4
gpt4 key购买 nike

我可能遗漏了一些明显的东西,因为我是 Groovy 的菜鸟,但我搜索过但没有找到我正在寻找的东西。我有一个测试课,我正在阅读一些 XML;我想在一系列元素的开头插入一个元素。我已经想出了如何替换第一个元素,并且我已经想出了如何附加一个节点到列表的末尾,但我似乎做不到了解如何在列表的开头(或理想情况下,任意位置)插入元素。

例如:

@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
}

产生:

<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 捆绑在一起,如果有的话。

最佳答案

一种方法是将 thing 元素从原始 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 )

打印

<container>
<listofthings>
<thing id="98" name="tim"/>
<thing id="99" name="groovy"/>
<thing id="100" name="foo"/>
<thing id="999" name="zebra"/>
</listofthings>
</container>

关于xml - Groovy:如何在使用 XMLSlurper() 读取的 XML 元素列表的开头插入节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6525966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com