4

Dom4Jを使用してxmlファイルを書き込むプログラムに取り組んでいます。私が書いているデータベーススキーマには、便利なxml検証とインポートスキーマがあります。Dom4Jはうまく機能していますが、Dom4JのXMLWriterクラスで「preserve」フィールドを設定する方法がわかりません。エンコードされた'\n'を保持する必要がある特定の要素があります。

このクラスのjavadocは、少し文書化されていませんhttp://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/XMLWriter.html

OutputFormatオブジェクトで遊んでみましたが、サイコロはありません。

XMLWriterオブジェクトが、ファイルに書き込むときにdom4jツリーの要素の空白を確実に保持する方法を教えてもらえますか。

ありがとう、

ドナルド

私が始めていると言う:

Element accession = factory.createElement("title"); 
List<String> AUT = new ArrayList<String>;
AUT.add("author1");
AUT.add("author2");
String title = "Title";

次のような出力が必要です。

<title>author1
author2
Title</title>

行リターンでタイトルフィールドにエンコードされます。

DefaultEntity e = new DefaultEntity("#10");
if(AUT.size() > 1) {
  for(String a : AUT) {
    accession.addText(a);
    accession.add(e);
  }
accession.addText(title);
}

IllegalAddExceptionであるため、これは機能しません。

4

1 に答える 1

3

まず、「preserve」プロパティは、以前にエンコードされた文字のエンコードを保持することとは関係ありません。要素に含まれる空白を保持することとは関係ありません。このプロパティは通常、xml:space="preserve"属性によって制御されます。

ただし、入力にエンコードされた改行があり、出力に保持したいというユースケースの場合は、問題が発生します。DOM4Jは、すべてのエンティティと文字参照を対応するJava文字(UTF-16)にデコードします。これは、基になるXMLreaderを構成することで部分的に制御できますが、私が知る限り、XMLReaderは文字参照の開始と終了を報告しません。これらは、対応する文字値にサイレントに置き換えられます。

出力時に、XMLWriterは、XML規則のため、またはシリアル化時に使用されるエンコード(UTF-8やISO-8859-1など)のために、エンコードが必要な文字のみをエンコードします。

この場合、基本的に2つのオプションがあります。

1)XMLWriterをサブクラス化し、characters()メソッドを完全に置き換えます。これは、空白の処理が実際にはこのメソッドに固有のものであるためです。タブ、改行、またはキャリッジリターンの書き込みを傍受できる方法は他にありません。ここでは、何とかして自分がどこにいるかを追跡し、正しい改行文字を処理していることを認識する必要があります

2)「再エスケープ」する改行文字を特定し、のプロパティをにDefaultEntity("#10")設定しながら、それをノードに置き換えます。このオプションは、既存のテキストノードを2つに分割し、その間にエンティティノードを挿入することを意味します。resolveEntityRefsXMLWriterfalse

オプション2のように、面倒でありながら、作業が少なくて済みます。

アップデート:

OK、同じエンティティを2回追加することはできないようです。動作するたびに新しいエンティティインスタンスを追加する場合。ただし、要素に追加することでケースを修正できますxml:space="preserve"

    if (AUT.size() > 1) {
        for (String a : AUT) {
            accession.addText(a);
            accession.addText("\n");
        }
        accession.addText(title);
    }

その後

    accession.addAttribute(QName.get("space", Namespace.XML_NAMESPACE),
            "preserve");

この場合、明示的に追加された改行は、xmlへの書き込み時に使用される出力形式に関係なく保持する必要があります。

混乱させて申し訳ありません。

于 2011-10-17T21:45:16.457 に答える