私の最初の質問には回答がありましたが、それはさらなる問題の原因となりました。
サンプルコード
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 ファイルを解析しようとしていますが、それをステージングおよびプロダクションに昇格させる前に、特定の属性値を置き換える必要があります。それはすべて問題ありませんが、さらに、エンコーディングと参照を保持する必要があります。スタイルシートに。
これは非常に静的であるため、エンコーディングとスタイルシート ref の両方を使用してもまったく問題ありません。つまり、最初に元のファイルで宣言を見つける必要はありません。
宣言発行のエンコーディング
ここ 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