我最初的问题已经得到解答,但这确实为进一步的问题打开了大门。
示例代码
使用 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