7

xml ファイルを編集するメソッドがあります。メソッドの概要は次のとおりです。

public void process(Path anXmlFile) {
    try {
        anXmlFile= anXmlFile.normalize();
        log.debug("processing {}",anXmlFile);
        Document dom = buildDOM(anXmlFile.toFile());

        //do stuff with dom...
        //delete original file
        //and finally ...
        dom.normalize(); //so we get a more predictable order

        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
        transformer.setOutputProperty(OutputKeys.INDENT,"yes");
        Source source = new DOMSource(dom);
        Result result = new StreamResult(anXmlFile.toFile());
        transformer.transform(source, result);
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

私の問題は、特定の行で開き、次の行で閉じるxmlに複数行のコメントがある場合です(改行文字に注意してください):

<!-- this is a long comment[cr][lf] 
     that spans 2 lines -->

変更した DOM を書き出した後の結果は次のようになります。

<!-- this is a long comment[cr] 
     that spans 2 lines -->

問題は [cr][lf] が [cr] になってしまうことです。これは、このように影響を受ける xml の唯一の部分です。他のすべての行末は元のもの ([cr][lf]) と同じです - 私が変更したものも含めて (私のコードは DOM のコメント ノードを変更しません)。

これを回避するために、作成した Transformer に与えることができる構成オプションはありますか? これはすべてJDKクラスを使用して行われ、xmlライブラリは含まれません。

4

1 に答える 1

3

\r\nXML 仕様では、 XML プロセッサ (パーサー) が\r単一の\n. \nしたがって、DOM テキスト ノードを調べると、行末としてしかないことがわかります。

DOM ツリーをシリアライズする場合、ほとんどの実装では、文字データで発生する改行を記述するときにプラットフォームのデフォルトを使用するか、行末文字列を明示的に設定するオプションを提供します。ただし、コメント テキストは文字データではありません。文字は他の処理なしでそのまま書き込まれます。少なくとも、これはほとんどのシリアライザーの動作です。

非常に重要な場合は、JDOM に切り替えて AbstractXMLOutputProcessor を拡張し、コメントの記述方法を変更できます。

于 2013-01-24T09:45:48.577 に答える