Groovy:将XML节点附加到现有的XML文档 [英] Groovy: append an XML Node to an existing XML document

查看:242
本文介绍了Groovy:将XML节点附加到现有的XML文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Groovy,我试图将xml节点插入到用XmlSlurper解析的xml文档中。
我设法在文档的末尾添加节点,但不是我真正需要的地方。



原始文档:

 < xml-fragment xmlns:ser =http://www.bea.com/wli/sb/servicesxmlns:xsi =http:/ /www.w3.org/2001/XMLSchema-instancexmlns:con =http://www.bea.com/wli/sb/pipeline/config> 
< ser:coreEntry isProxy =trueisEnabled =trueisTracingEnabled =false>
< ser:binding type =SOAPisSoap12 =falsexsi:type =con:SoapBindingTypexmlns:con =http://www.bea.com/wli/sb/services/bindings /配置>
< con:wsdl ref =bus / src / main / osb / interfaces / apilink / ChargeServices/>
< con:port>
< con:name> ChargeServicesPort< / con:name>
< con:namespace> java:d​​k.tdc.apilink.logic.sessions.interfaces< / con:namespace>
< / con:port>
< con:selector type =SOAP body/>
< / ser:binding>
< / ser:coreEntry>
< / xml-fragment>

要添加的片段

  def fragmentToAddXml ='''
< ser:security xmlns:ser =http://www.bea.com/wli/sb/servicesxmlns:xsi =http:/ /www.w3.org/2001/XMLSchema-instancexmlns:con =http://www.bea.com/wli/sb/pipeline/config> hello< / ser:security>
'''

这是我使用的代码。

  def root = new XmlSlurper()。parseText(file.getText())

root.'core-entry' .appendNode(fragmentToAddXml)
def xmlBuilder = new groovy.xml.StreamingMarkupBuilder()。bind {mkp.yield root}

请注意,新节点应放置在之前节点。



结果应该be:

 < xml-fragment xmlns:ser =http://www.bea.com/wli/sb/服务xmlns:xsi =http://www.w3.org/2001/XMLSchema-instancexmlns:con =http://www.bea.com/wli/sb/pipeline/config> 
< ser:coreEntry isProxy =trueisEnabled =trueisTracingEnabled =false>
< ser:security xmlns:ser =http://www.bea.com/wli/sb/servicesxmlns:xsi =http://www.w3.org/2001/XMLSchema-instance xmlns:con =http://www.bea.com/wli/sb/pipeline/config> hello< / ser:security>

< ser:binding type =SOAPisSoap12 =falsexsi:type =con:SoapBindingTypexmlns:con =http://www.bea.com/wli/sb /服务/绑定/配置>
< con:wsdl ref =bus / src / main / osb / interfaces / apilink / ChargeServices/>
< con:port>
< con:name> ChargeServicesPort< / con:name>
< con:namespace> java:d​​k.tdc.apilink.logic.sessions.interfaces< / con:namespace>
< / con:port>
< con:selector type =SOAP body/>
< / ser:binding>
< / ser:coreEntry>
< / xml-fragment>

谢谢

Luciano

解决方案

给定xml(用于测试的字符串)

  def xml ='''< xml-fragment xmlns:ser =http://www.bea.com/wli/sb/servicesxmlns:xsi =http://www.w3。 org / 2001 / XMLSchema-instancexmlns:con =http://www.bea.com/wli/sb/pipeline/config> 
< ser:coreEntry isProxy =trueisEnabled =trueisTracingEnabled =false>
< ser:binding type =SOAPisSoap12 =falsexsi:type =con:SoapBindingTypexmlns:con =http://www.bea.com/wli/sb/services/bindings /配置>
< con:wsdl ref =bus / src / main / osb / interfaces / apilink / ChargeServices/>
< con:port>
< con:name> ChargeServicesPort< / con:name>
< con:namespace> java:d​​k.tdc.apilink.logic.sessions.interfaces< / con:namespace>
< / con:port>
< con:selector type =SOAP body/>
< / ser:binding>
< / ser:coreEntry>
< / xml-fragment>'''

您要添加的xml as:

  def toadd ='''< ser:security xmlns:ser =http://www.bea。 com / wli / sb / servicesxmlns:xsi =http://www.w3.org/2001/XMLSchema-instancexmlns:con =http://www.bea.com/wli/sb/pipeline/配置> 
hello
< / ser:security>'''

然后你可以解析它们(使用 XmlSlurper 设置为通过第二个 true 参数使用名称空间)

  def root = new XmlSlurper(false,true).parseText(xml)
fragmentToAdd = new XmlSlurper(false,true).parseText(toadd)

添加xml以添加到 data 节点(因为您希望它在 data 中,而不是 lastname

  root.coreEntry.appendNode(fragmentToAdd)

然后打印出来:

  String outxml = groovy.xml.XmlUtil.serialize(root)
println outxml

其中包含:

 <?xml version =1.0encoding =UTF-8?> 
< xml-fragment>
< ser:coreEntry xmlns:ser =http://www.bea.com/wli/sb/servicesisTracingEnabled =falseisProxy =trueisEnabled =true>
< ser:binding xmlns:xsi =http://www.w3.org/2001/XMLSchema-instanceisSoap12 =falsexsi:type =SOAP>
< con:name> ChargeServicesPort< / con:name>
< con:namespace> java:d​​k.tdc.apilink.logic.sessions.interfaces< / con:namespace>
< / con:port>
< / ser:binding>
< ser:security>
hello
< / ser:security>
< / ser:coreEntry>
< / xml-fragment>

我相信这是正确的(未按照我的意愿格式化为100%,但是正确); - )

编辑



如果订单很重要,您可以使用 XmlParser >像这样:

  def root = new XmlParser(false,true).parseText(xml)
fragmentToAdd = new XmlParser(false,true).parseText(toadd)

//在第一个coreEntry节点的子节点位置0处插入这个新节点
root.find {it.name ()=='ser:coreEntry'} .children()。add(0,fragmentToAdd)

String outxml = groovy.xml.XmlUtil.serialize(root)
println outxml


I'm using Groovy and I'm trying to insert an xml node into a xml document parsed with XmlSlurper. I manage to add the node at the end of the document but not where I really need to.

Original doc:

<xml-fragment xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config"> 
    <ser:coreEntry isProxy="true" isEnabled="true" isTracingEnabled="false">
        <ser:binding type="SOAP" isSoap12="false" xsi:type="con:SoapBindingType" xmlns:con="http://www.bea.com/wli/sb/services/bindings/config">
          <con:wsdl ref="bus/src/main/osb/interfaces/apilink/ChargeServices"/>
          <con:port>
            <con:name>ChargeServicesPort</con:name>
            <con:namespace>java:dk.tdc.apilink.logic.sessions.interfaces</con:namespace>
          </con:port>
          <con:selector type="SOAP body"/>
        </ser:binding>
    </ser:coreEntry>
</xml-fragment>

Fragment to add

def fragmentToAddXml = '''
<ser:security xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">hello</ser:security>
'''

This is the code I'm using.

def root = new XmlSlurper().parseText(file.getText())

root.'core-entry'.appendNode( fragmentToAddXml )
def xmlBuilder = new groovy.xml.StreamingMarkupBuilder().bind{ mkp.yield root }

Please note that the new node should be placed before the "ser:binding" node.

The result should be:

<xml-fragment xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config"> 
        <ser:coreEntry isProxy="true" isEnabled="true" isTracingEnabled="false">
            <ser:security xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">hello</ser:security>

            <ser:binding type="SOAP" isSoap12="false" xsi:type="con:SoapBindingType" xmlns:con="http://www.bea.com/wli/sb/services/bindings/config">
              <con:wsdl ref="bus/src/main/osb/interfaces/apilink/ChargeServices"/>
              <con:port>
                <con:name>ChargeServicesPort</con:name>
                <con:namespace>java:dk.tdc.apilink.logic.sessions.interfaces</con:namespace>
              </con:port>
              <con:selector type="SOAP body"/>
            </ser:binding>
        </ser:coreEntry>
    </xml-fragment>

Thanks

Luciano

解决方案

Given the xml (in a string for testing)

def xml = '''<xml-fragment xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config"> 
    <ser:coreEntry isProxy="true" isEnabled="true" isTracingEnabled="false">
        <ser:binding type="SOAP" isSoap12="false" xsi:type="con:SoapBindingType" xmlns:con="http://www.bea.com/wli/sb/services/bindings/config">
          <con:wsdl ref="bus/src/main/osb/interfaces/apilink/ChargeServices"/>
          <con:port>
            <con:name>ChargeServicesPort</con:name>
            <con:namespace>java:dk.tdc.apilink.logic.sessions.interfaces</con:namespace>
          </con:port>
          <con:selector type="SOAP body"/>
        </ser:binding>
    </ser:coreEntry>
</xml-fragment>'''

And the xml you want to add as:

def toadd = '''<ser:security xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">
  hello
</ser:security>'''

Then you can parse them both (with XmlSlurper set to use namespaces via the 2nd true parameter)

def root = new XmlSlurper( false, true ).parseText( xml )
fragmentToAdd = new XmlSlurper( false, true ).parseText( toadd )

Append the xml to add to the data node (as you want it inside data, not lastname)

root.coreEntry.appendNode( fragmentToAdd )

Then print it out:

String outxml = groovy.xml.XmlUtil.serialize( root )
println outxml

Which prints:

<?xml version="1.0" encoding="UTF-8"?>
<xml-fragment>
  <ser:coreEntry xmlns:ser="http://www.bea.com/wli/sb/services" isTracingEnabled="false" isProxy="true" isEnabled="true">
    <ser:binding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" isSoap12="false" xsi:type="SOAP">
      <con:wsdl xmlns:con="http://www.bea.com/wli/sb/services/bindings/config" ref="bus/src/main/osb/interfaces/apilink/ChargeServices"/>
      <con:port xmlns:con="http://www.bea.com/wli/sb/services/bindings/config">
        <con:name>ChargeServicesPort</con:name>
        <con:namespace>java:dk.tdc.apilink.logic.sessions.interfaces</con:namespace>
      </con:port>
      <con:selector xmlns:con="http://www.bea.com/wli/sb/services/bindings/config" type="SOAP body"/>
    </ser:binding>
    <ser:security>
    hello
  </ser:security>
  </ser:coreEntry>
</xml-fragment>

Which I believe is correct (not formatted 100% as I'd like, but correct) ;-)

Edit

If order is important, you can use XmlParser like so:

def root = new XmlParser( false, true ).parseText( xml )
fragmentToAdd = new XmlParser( false, true ).parseText( toadd )

// Insert this new node at position 0 in the children of the first coreEntry node
root.find { it.name() == 'ser:coreEntry' }.children().add( 0, fragmentToAdd )

String outxml = groovy.xml.XmlUtil.serialize( root )
println outxml

这篇关于Groovy:将XML节点附加到现有的XML文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆