将 XML 片段插入 Groovy 中的另一个 XML 文档
Inserting XML snippet into another XML document in Groovy
以下代码片段应将片段 XML 插入正文,紧跟在 elem 之后。
def body = '''
<parent>
<child>
<elem>
<name>Test</name>
</elem>
</child>
</parent>
'''
def fragment = '''
<foo>
<bar>hello!</bar>
<baz/>
</foo>
'''
def bodyNode = new XmlParser().parseText(body)
def fragmentNode = new XmlParser().parseText(fragment)
bodyNode.child*.appendNode(fragmentNode)
def newFileName= '/Users/xxx/out.xml'
def writer = new FileWriter(newFileName)
new XmlNodePrinter(new PrintWriter(writer)).print(bodyNode)
out.xml的预期内容:
<parent>
<child>
<elem>
<name>Test</name>
</elem>
<foo>
<bar>hello!</bar>
<baz/>
</foo>
</child>
</parent>
但是我得到的是:
<parent>
<child>
<elem>
<name>Test</name>
</elem>
<foo/>
</child>
</parent>
如你所见,foo 元素的内容被省略了。这种行为的原因是什么?我怎样才能获得正确的输出?
原因:
使用 appendNode()
而不是 append()
。试试这个:
bodyNode.child*.append(fragmentNode)
或者
这是使用 XmlSlurper
实现正确输出的一种方法:
def body = '''
<parent>
<child>
<elem>
<name>Test</name>
</elem>
</child>
</parent>
'''
def fragment = '''
<foo>
<bar>hello!</bar>
<baz/>
</foo>
'''
def slurper = new XmlSlurper( false, false, false )
def bodyNode = slurper.parseText( body )
def fragmentNode = slurper.parseText( fragment )
bodyNode.child << fragmentNode
def sw = new StringWriter()
groovy.xml.XmlUtil.serialize(bodyNode, sw)
println sw.toString()
使用XmlParser
的工作示例:
import groovy.xml.XmlUtil
def body = '''
<parent>
<child>
<elem>
<name>Test</name>
</elem>
</child>
</parent>
'''
def fragment = '''
<foo>
<bar>hello!</bar>
<baz/>
</foo>
'''
def bodyNode = new XmlParser().parseText(body)
def fragmentNode = new XmlParser().parseText(fragment)
bodyNode.child[0].children().add(fragmentNode)
println(XmlUtil.serialize(bodyNode))
以下代码片段应将片段 XML 插入正文,紧跟在 elem 之后。
def body = '''
<parent>
<child>
<elem>
<name>Test</name>
</elem>
</child>
</parent>
'''
def fragment = '''
<foo>
<bar>hello!</bar>
<baz/>
</foo>
'''
def bodyNode = new XmlParser().parseText(body)
def fragmentNode = new XmlParser().parseText(fragment)
bodyNode.child*.appendNode(fragmentNode)
def newFileName= '/Users/xxx/out.xml'
def writer = new FileWriter(newFileName)
new XmlNodePrinter(new PrintWriter(writer)).print(bodyNode)
out.xml的预期内容:
<parent>
<child>
<elem>
<name>Test</name>
</elem>
<foo>
<bar>hello!</bar>
<baz/>
</foo>
</child>
</parent>
但是我得到的是:
<parent>
<child>
<elem>
<name>Test</name>
</elem>
<foo/>
</child>
</parent>
如你所见,foo 元素的内容被省略了。这种行为的原因是什么?我怎样才能获得正确的输出?
原因:
使用 appendNode()
而不是 append()
。试试这个:
bodyNode.child*.append(fragmentNode)
或者
这是使用 XmlSlurper
实现正确输出的一种方法:
def body = '''
<parent>
<child>
<elem>
<name>Test</name>
</elem>
</child>
</parent>
'''
def fragment = '''
<foo>
<bar>hello!</bar>
<baz/>
</foo>
'''
def slurper = new XmlSlurper( false, false, false )
def bodyNode = slurper.parseText( body )
def fragmentNode = slurper.parseText( fragment )
bodyNode.child << fragmentNode
def sw = new StringWriter()
groovy.xml.XmlUtil.serialize(bodyNode, sw)
println sw.toString()
使用XmlParser
的工作示例:
import groovy.xml.XmlUtil
def body = '''
<parent>
<child>
<elem>
<name>Test</name>
</elem>
</child>
</parent>
'''
def fragment = '''
<foo>
<bar>hello!</bar>
<baz/>
</foo>
'''
def bodyNode = new XmlParser().parseText(body)
def fragmentNode = new XmlParser().parseText(fragment)
bodyNode.child[0].children().add(fragmentNode)
println(XmlUtil.serialize(bodyNode))