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

时间:2011-12-05 12:06:16

标签: java groovy

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

我使用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() 

我的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>

期望的输出

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

更新

还有一个问题,我问的问题是由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;

2 个答案:

答案 0 :(得分:3)

如果你像这样使用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 )

编辑 - 回答次要无关问题

如果你在名为txt的变量中有这个,你应该可以这样做:

txt = txt.replace( '&lt;', '<' )
         .replace( '&gt;', '>' )

然后,将txt传递给XmlSlurper.parseText()

虽然真的,但我会说这是一个问题,因为它将源代码写出来,因此它不能用作xml,但在网上很有用。

答案 1 :(得分:0)

这就是我做的

问题是,在xml标记构建器中,如果我们给出一个包含xml / html内容的字符串,它会转换<&amp; >&lt;&amp; &gt;分别为了避免这种情况取代所有&lt;&amp; &gt;<&amp; >可能会有效,但有时候您有CDATA部分,可能会再次包含&lt;,我不想替换它,所以我使用了mkp.yieldUnescaped content

File domainMetaFile = new File(System.getProperty("user.dir")+"/DomainMeta.xml")

if ( domainMetaFile.exists( ) )
{
    String content = domainMetaFile.getText()
    def rootNode= domainMetaFile.readLines().get(0)  
//getting the root node
    def node=rootNode.find("[\\w\\d]+")
    content=content.replaceAll("</"+node+">","").replaceAll("<"+node+">","")     
//removing the root node from the string $content
    csm."$node"{mkp.yieldUnescaped content}  
//adding $content to my existing xml builder (csm)
//Here i am using mkp.yieldUnescaped content to ignore escaping of HTML/XML characters

}
else
csm.DomainMeta(na){}