0

最初的问题已经得到解答,但这确实为进一步的问题打开了大门。

示例代码

使用 Groovy 2.0.5 JVM 1.6.0_31

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

def xml = '''<?xml version="1.0" encoding="UTF-16"?>
            | <?xml-stylesheet type="text/xsl" href="Bp8DefaultView.xsl"?>
             |<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

// Edit: Added the line below 
def pi = document.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="Bp8DefaultView.xsl"');
// Edit #2: Added line below
document.insertBefore(pi, root)

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

def outputfile = new File( 'c:/temp/output.xml' )
XmlUtil.serialize( root , new PrintWriter(outputfile))
// Edit #2: Changed from root to document.documentElement to see if that 
// would make any difference
println XmlUtil.serialize(document.documentElement)

问题描述

我正在尝试解析从第三方工具导出的 XML 文件,在将其推广到舞台和生产之前,我需要替换某些属性值。没关系,但除此之外我必须保留编码和参考。到样式表。

由于这是相当静态的,因此同时拥有编码和样式表参考是完全可以的。在属性文件中定义,意思是:我不需要先在原始文件中找到声明。

声明问题中的编码

如在 StackOverFlow 上找到的这个答案所示,您可以这样做

new File('c:/data/myutf8.xml').write(f,'utf-8')

我也试过

XmlUtil.serialize( root , new GroovyPrintStream('c:/temp/output.txt', 'utf-16'))

但它也没有为我解决问题。所以我不明白如何覆盖 UTF 值。

处理指令问题

简单地说,我该如何添加

<?xml-stylesheet type="text/xsl" href="Bp8DefaultView.xsl"?>

到输出?

更新- 这可以像这样完成

def pi = document.createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="Bp8DefaultView.xsl"');

正在像这样添加处理指令,这条指南向我展示了,但我仍然没有得到输出。

document.insertBefore(pi, root) // Fails
4

1 回答 1

0

这个问题中的所有问题都已在我提出的另一个问题中得到解答,请参阅 Groovy 和 XML:无法插入处理指令

诀窍是我预期的

document.documentElement

包含处理指令。但这是错误的,documentElement 是:

...这是一个便利属性,允许直接访问作为文档的文档元素的子节点...

处理指令只是另一个子节点。所以我不得不使用的是LSSerializerTransfomer。有关详细信息,请参阅在根元素之前序列化 XML 处理指令

于 2012-12-09T19:49:55.307 回答