122

Java の組み込み XML トランスフォーマーを使用して、DOM ドキュメントを取得し、結果の XML を出力しています。問題は、パラメータ「インデント」を明示的に設定したにもかかわらず、テキストをまったくインデントしていないことです。

サンプルコード

public class TestXML {

 public static void main(String args[]) throws Exception {
  ByteArrayOutputStream s;

  Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
  Transformer t = TransformerFactory.newInstance().newTransformer();

  Element a,b;

  a = d.createElement("a");
  b = d.createElement("b");

  a.appendChild(b);

  d.appendChild(a);

  t.setParameter(OutputKeys.INDENT, "yes");

  s = new ByteArrayOutputStream();

  t.transform(new DOMSource(d),new StreamResult(s));

  System.out.println(new String(s.toByteArray()));

 }
}

結果

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

望ましい結果

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

考え?

4

7 に答える 7

228

「INDENT」を有効にして、トランスフォーマーのインデント量を設定する必要があります。

t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

アップデート:


参照 :シリアル化の前に DOM から空白のみのテキスト ノードを取り除く方法は?

(すべてのメンバー、特に @marc-novakowski、@james-murty、@saad に感謝します) :

于 2009-09-06T03:44:40.510 に答える
23

提案された解決策はどちらもうまくいきませんでした。そこで、別の解決策を探し続けましたが、最終的には、前述の 2 つと 3 番目のステップが混在していました。

  1. インデント番号を TransformerFactory に設定します
  2. トランスでインデントを有効にする
  3. otuputstream をライター (または bufferedwriter) でラップする
//(1)
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));

//(2)
Transformer t = tf.newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");

//(3)
t.transform(new DOMSource(doc),
new StreamResult(new OutputStreamWriter(out, "utf-8"));

xml 処理コードの「バグのある」動作を回避するには、(3) を実行する必要があります。

ソース: johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446

(引用元が間違っていた場合はお知らせください)

于 2011-09-14T07:51:17.027 に答える
14

次のコードは、Java 7 で動作しています。トランスフォーマー (トランスフォーマー ファクトリではない) にインデント (yes) とインデント量 (2) を設定して動作させます。

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

属性を設定する@mabacの解決策はうまくいきませんでしたが、@lapoのコメントは役に立ちました。

于 2012-01-09T10:14:57.537 に答える
6

インデントが必要な場合は、 に指定する必要がありますTransformerFactory

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();
于 2009-12-04T21:39:00.383 に答える
4

私にとっては、追加が機能しDOCTYPE_PUBLICました:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");
于 2016-08-12T11:58:07.657 に答える