在Groovy中将XML片段插入到另一个XML文档中

在Groovy中将XML片段插入到另一个XML文档中,xml,groovy,Xml,Groovy,下面的代码片段应该将片段XML插入到正文中,就在元素之后 def body = ''' <parent> <child> <elem> <name>Test</name> </elem> </child> </parent> ''' def fragment = ''' <f

下面的代码片段应该将片段XML插入到正文中,就在元素之后

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)    
def body=''
试验
'''
def片段=“”
你好
'''
def bodyNode=new XmlParser().parseText(body)
def fragmentNode=新的XmlParser().parseText(片段)
bodyNode.child*.appendNode(fragmentNode)
def newFileName='/Users/xxx/out.xml'
def writer=newfilewriter(newFileName)
新的XmlNodePrinter(新的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()
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))
def body=''
试验
'''
def片段=“”
你好
'''
def slurper=new-XmlSlurper(false,false,false)
def bodyNode=slurper.parseText(正文)
def fragmentNode=slurper.parseText(片段)

bodyNode.child使用
XmlParser的工作示例:

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()
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))
import groovy.xml.XmlUtil
定义正文=“”
试验
'''
def片段=“”
你好
'''
def bodyNode=new XmlParser().parseText(body)
def fragmentNode=新的XmlParser().parseText(片段)
bodyNode.child[0].children().add(fragmentNode)
println(XmlUtil.serialize(bodyNode))

这会将
添加为
的同级,因为add()to children()只会附加在dom的底部。我猜
需要是
bodyNode.child[-1].children().add(fragmentNode)
;)的子级谢谢,使用append works(顺便说一句,有什么区别?)。对于XmlUtil.serialize,也是+1,比XmlNodePrinter可读性好得多。通读api中前两个方法的描述。