[英]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");
更新:
(非常感謝所有成員,尤其是 @marc-novakowski、@james-murty 和 @saad) :
建議的解決方案都不適合我。 所以我一直在尋找替代解決方案,最終將前面提到的兩者和第三步混合在一起。
//(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.