使用Groovy解析XML:解析XML文件时如何保持CDATA

使用Groovy解析XML:解析XML文件时如何保持CDATA,groovy,xml-parsing,cdata,Groovy,Xml Parsing,Cdata,使用Groovy 2.0.5 JVM 1.6.031,我创建了一个以现有XML文件作为输入的脚本 def root = new XmlParser().parse(new File('filename')) 我解析文件并替换如下某些属性 root.Settings.Setting.each { if (it.'@NAME' =~ 'CASEID_SEQUENCE_SIZE') { it.'@VALUE' = '100' def outputfile = new File( level

使用Groovy 2.0.5 JVM 1.6.031,我创建了一个以现有XML文件作为输入的脚本

def root = new XmlParser().parse(new File('filename'))
我解析文件并替换如下某些属性

root.Settings.Setting.each {
if (it.'@NAME' =~ 'CASEID_SEQUENCE_SIZE') {
   it.'@VALUE' = '100' 
def outputfile = new File( levelConfig.RESULTFILE )
new XmlNodePrinter(new PrintWriter(outputfile)).print(root)
<HandlerURL>
   <![CDATA[admin/MainWindow.jsp]]>
</HandlerURL>
最后,将更改写入一个新文件,如下所示

root.Settings.Setting.each {
if (it.'@NAME' =~ 'CASEID_SEQUENCE_SIZE') {
   it.'@VALUE' = '100' 
def outputfile = new File( levelConfig.RESULTFILE )
new XmlNodePrinter(new PrintWriter(outputfile)).print(root)
<HandlerURL>
   <![CDATA[admin/MainWindow.jsp]]>
</HandlerURL>
所有这些都很好,没有问题,除非XML有CDATA,比如

root.Settings.Setting.each {
if (it.'@NAME' =~ 'CASEID_SEQUENCE_SIZE') {
   it.'@VALUE' = '100' 
def outputfile = new File( levelConfig.RESULTFILE )
new XmlNodePrinter(new PrintWriter(outputfile)).print(root)
<HandlerURL>
   <![CDATA[admin/MainWindow.jsp]]>
</HandlerURL>

结果是

<HandlerURL>
    admin/MainWindow.jsp
</HandlerURL>

admin/MainWindow.jsp
问题是 如何使脚本不使用CDATA执行任何操作?

发现您可以执行以下操作:

import groovy.xml.*
import groovy.xml.dom.DOMCategory

def xml = '''<root>
            |  <Settings>
            |    <Setting name="CASEID_SEQUENCE_SIZE">
            |      <HandlerURL>
            |        <![CDATA[ admin/MainWindow.jsp ]]>
            |      </HandlerURL>
            |    </Setting>
            |    <Setting name="SOMETHING_ELSE">
            |      <HandlerURL>
            |        <![CDATA[ admin/MainWindow.jsp ]]>
            |      </HandlerURL>
            |    </Setting>
            |  </Settings>
            |</root>'''.stripMargin()

def document = DOMBuilder.parse( new StringReader( xml ) )
def root = document.documentElement

use(DOMCategory) {
  root.Settings.Setting.each {
    if( it.'@name' == 'CASEID_SEQUENCE_SIZE' ) {
      it[ '@value' ] = 100
    }
  }
}

def result = XmlUtil.serialize( root )

println result
导入groovy.xml* 导入groovy.xml.dom.domcegory def xml='' | | | | | | | | | | | | |''.stripMargin() def document=domguilder.parse(新的StringReader(xml)) def root=document.documentElement 用途(类别){ root.Settings.Setting.each{ if(it.'@name'='CASEID\u SEQUENCE\u SIZE'){ 它['@value']=100 } } } def result=XmlUtil.serialize(根) 打印结果 要获得输出,请执行以下操作:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <Settings>
    <Setting name="CASEID_SEQUENCE_SIZE" value="100">
      <HandlerURL>
        <![CDATA[ admin/MainWindow.jsp ]]>
      </HandlerURL>
    </Setting>
    <Setting name="SOMETHING_ELSE">
      <HandlerURL>
        <![CDATA[ admin/MainWindow.jsp ]]>
      </HandlerURL>
    </Setting>
  </Settings>
</root>


必须将写文件文件更改为XMLUTIL.SerialEngt(根,新PrimTrrItter(OutPutfile)),否则XML就被截断在文件中间某个地方。