【问题标题】:Parse XML using Groovy: How do I keep the CDATA when parsing a XML file使用 Groovy 解析 XML:解析 XML 文件时如何保留 CDATA
【发布时间】:2012-11-30 14:19:43
【问题描述】:

使用 Groovy 2.0.5 JVM 1.6.0_31,我创建了一个将现有 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)

这一切都很好,没问题,除非XML有CDATA,像这样

<HandlerURL>
   <![CDATA[admin/MainWindow.jsp]]>
</HandlerURL>

结果就是

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

问题是

如何让我的脚本不对 CDATA 执行任何操作?

【问题讨论】:

  • 必须将写入文件的代码更改为 XmlUtil.serialize( root , new PrintWriter(outputfile)) ,否则 XML 只是在文件中间的某处被切断

标签: groovy xml-parsing cdata


【解决方案1】:

发现你可以做到:

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

获取输出:

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

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2012-01-19
    • 2021-12-15
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多