簡體   English   中英

Java:如何縮進 Transformer 生成的 XML

[英]Java: How to Indent XML Generated by Transformer

我正在使用 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>

想法?

您需要啟用“INDENT”並設置變壓器的縮進量:

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

更新:


參考: 如何在序列化之前從 DOM 中去除純空白文本節點?

(非常感謝所有成員,尤其是 @marc-novakowski、@james-murty 和 @saad)

建議的解決方案都不適合我。 所以我一直在尋找替代解決方案,最終將前面提到的兩者和第三步混合在一起。

  1. 將縮進號設置為transformerfactory
  2. 啟用變壓器中的縮進
  3. 用寫入器(或緩沖寫入器)包裝 otuputstream
//(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"));

您必須執行 (3) 來解決 xml 處理代碼的“錯誤”行為。

來源:johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446

(如果我錯誤地引用了我的來源,請告訴我)

以下代碼適用於 Java 7。我在變壓器(不是變壓器工廠)上設置了縮進(是)和縮進量(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 的評論證明很有幫助。

導入 com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");

如果需要縮進,則必須將其指定給TransformerFactory

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();

我使用了 Xerces (Apache) 庫,而不是使用 Transformer。 添加庫后,添加以下代碼。

OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer outxml = new FileWriter(new File("out.xml"));
XMLSerializer serializer = new XMLSerializer(outxml, format);
serializer.serialize(document);

對我來說,添加DOCTYPE_PUBLIC有效:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM