8

Transformer によって生成された XML をインデントしようとしています。最初のノード - ドキュメント要素を除いて、すべての DOM ノードが期待どおりにインデントされています。document 要素は新しい行で開始されず、XML 宣言の直後に連結されます。

このバグは、Java 1.7 に移行したときに発生します。Java 1.6 または 1.5 を使用している場合は発生しません。

私のコード:

ByteArrayOutputStream s = new OutputStreamWriter(out, "utf-8");

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount","4");

transformer.transform(new DOMSource(doc), new StreamResult(s));

出力:

<?xml version="1.0" encoding="UTF-8"?><a>
       <b>bbbbb</b>
 </a>

誰でも理由を知っていますか?

ところで、プロパティを追加すると

transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");

期待どおりに動作しますが、xml 宣言が変更され、スタンドアロン プロパティも含まれるようになりました。xml 宣言を変更したくありません。

4

4 に答える 4

15

Ok 、

私はJava APIでこれを見つけました:

doctype-system プロパティが指定されている場合、xml 出力メソッドは、最初の要素の直前にドキュメント タイプ宣言を出力する必要があります。

SO私はこのプロパティを使用しました

 transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");

そして、xml宣言を変更せずに問題を解決します。

ありがとう。

于 2013-08-15T11:38:00.113 に答える
0

これは、Java での XML 実装の問題 (バグ) のようです。standaloneXML 宣言の後に改行を入れる唯一の方法は、属性を明示的に指定することです。noDTD を使用していない場合はまったく関係なくても、暗黙のデフォルトである に設定できます。

于 2016-04-04T07:44:44.920 に答える