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 ファイルを解析しようとしていますが、それをステージングおよびプロダクションに昇格させる前に、特定の属性値を置き換える必要があります。それはすべて問題ありませんが、さらに、エンコーディングと参照を保持する必要があります。スタイルシートに。

これは非常に静的であるため、エンコーディングとスタイルシート 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
4

1 に答える 1

0

この質問のすべての問題は、私が提起した別の質問で回答されています 。Groovy and XML: Not able to insert processing instruction を参照してください

トリックは、私が期待したことです

document.documentElement

処理命令を含めます。しかし、それは間違っています。documentElement は次のとおりです。

...これは、ドキュメントのドキュメント要素である子ノードに直接アクセスできる便利な属性です...

処理命令は単なる別の子ノードです。そのため、代わりにLSSerializerまたはTransformerを使用する必要がありました。詳細については、ルート要素の前に XML 処理命令をシリアライズするを参照してください。

于 2012-12-09T19:49:55.307 に答える