如何使用 groovy 将另一个 xml 文件内容添加到现有 xml 创建中

abi*_*964 2 java groovy

我有一个要求,要收集系统和一些产品特定信息,那么有没有办法可以product在我的 xml 构建器中将现有的 xml 内容附加到标签中?

我的测试代码使用 groovy 创建 xml

import groovy.xml.MarkupBuilder
import org.custommonkey.xmlunit.*

def writer = new StringWriter()  
def builder = new groovy.xml.MarkupBuilder(writer) 

def xml=new XmlSlurper().parse("E:\\DomainMeta.xml")

builder.csm() { 
    system(osname:"linux", hostname:"panther")
    product()
    {
        //Here i'd like to add my xml content, starting with <DomainMeta>
    }

} 
println writer.toString() 
Run Code Online (Sandbox Code Playgroud)

我的 xml,必须复制到我在上面构建的另一个 xml 中

<DomainMeta>    //there can be more dynamic information inside DomainMeta tag
<Gateways>
<NodeRef name="N_116489" host="panther" httpPort="18,448" port="18,449" />
</Gateways>
<OptionGroup name="DomainOptions">
    <Option name="LicenseUsageDetailMinDays" value="90" ></Option>
</OptionGroup>
<OptionGroup name="NodeOptions">
    <Option name="LicenseUsageDetailMinDays" value="90" ></Option>
</OptionGroup>  
</DomainMeta>
Run Code Online (Sandbox Code Playgroud)

所需输出

<csm>
  <system osname='linux' hostname='panther' />
  <product>
    <DomainMeta>
    <Gateways>
    <NodeRef name="N_116489" host="panther" httpPort="18,448" port="18,449" />
    </Gateways>
    <OptionGroup name="DomainOptions">
        <Option name="LicenseUsageDetailMinDays" value="90" ></Option>
    </OptionGroup>
    <OptionGroup name="NodeOptions">
        <Option name="LicenseUsageDetailMinDays" value="90" ></Option>
    </OptionGroup>
    </DomainMeta>
  </product>
</csm>
Run Code Online (Sandbox Code Playgroud)

更新

还有一个问题,我问的问题由 tim_yates 回答,但我在这里面临另一个问题,转储中的 xml 数据采用下面给出的格式,@tim:你能帮忙吗?

&lt;DomainMeta&gt;
&lt;Gateways&gt;
&lt;NodeRef name="N_116489" host="panther" httpPort="18,448" port="18,449" /&gt;
&lt;/Gateways&gt;
&lt;OptionGroup name="DomainOptions"&gt;
    &lt;Option name="LicenseUsageDetailMinDays" value="90" &gt;&lt;/Option&gt;
&lt;/OptionGroup&gt;
&lt;OptionGroup name="NodeOptions"&gt;
    &lt;Option name="LicenseUsageDetailMinDays" value="90" &gt;&lt;/Option&gt;
&lt;/OptionGroup&gt;  
&lt;/DomainMeta&gt;
Run Code Online (Sandbox Code Playgroud)

tim*_*tes 5

如果您使用 StreamingMarkupBuilder 就可以做到这一点,如下所示:

import groovy.xml.XmlUtil
import groovy.xml.StreamingMarkupBuilder

def xml = new XmlSlurper().parse("E:\\DomainMeta.xml")

def out = new StreamingMarkupBuilder().bind { 
  csl {
    system(osname:"linux", hostname:"panther")
    product() {
       mkp.yield xml
    }
  }
}

println XmlUtil.serialize( out )
Run Code Online (Sandbox Code Playgroud)

编辑——回答次要的不相关问题

如果你有一个名为 的变量txt,你应该能够这样做:

txt = txt.replace( '&lt;', '<' )
         .replace( '&gt;', '>' )
Run Code Online (Sandbox Code Playgroud)

然后,将其传递txtXmlSlurper.parseText()

虽然说实话,我想说这是一个将源代码写出来的问题,所以它不能作为 xml 使用,但在网络上很漂亮。