我有一个要求,我正在收集系统和一些产品特定信息,那么有没有办法可以将现有的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:你能帮忙吗?
<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>
答案 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( '<', '<' )
.replace( '>', '>' )
然后,将txt
传递给XmlSlurper.parseText()
虽然真的,但我会说这是一个问题,因为它将源代码写出来,因此它不能用作xml,但在网上很有用。
答案 1 :(得分:0)
这就是我做的
问题是,在xml标记构建器中,如果我们给出一个包含xml / html内容的字符串,它会转换<
&amp; >
至<
&amp; >
分别为了避免这种情况取代所有<
&amp; >
与<
&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){}