摘要:我想將一個org.w3c.dom.Document
保存爲帶有很好縮進的文件(很漂亮地打印出來)。下面的代碼與Transformer
可以在某些情況下完成這項工作,但不是在所有情況下(請參閱示例)。你能幫我解決這個問題嗎?將org.w3c.dom.Document中的XML美化爲文件
我有一個org.w3c.dom.Document
(而不是org.jdom.Document
),並希望自動格式化並打印到文件中。我怎樣才能做到這一點?我想這一點,但如果有在文檔中附加的換行不工作:
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
public class Main {
public static void main(String[] args) {
try {
String input = "<asdf>\n\n<a>text</a></asdf>";
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(input.getBytes()));
System.out.println("-- input -------------------\n" + input + "\n----------------------------");
System.out.println("-- output ------------------");
prettify(doc);
System.out.println("----------------------------");
} catch (Exception e) {}
}
public static void prettify(Document doc) {
try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(new DOMSource(doc), new StreamResult(System.out));
} catch (Exception e) {}
}
}
我已指示輸出中,以System.out
,這樣就可以不管你想要的(例如on Ideone.com)輕鬆地運行它。你可以看到,輸出是不是漂亮。如果我從輸入字符串中刪除\n\n
,一切都很好。而且文檔通常不是來自字符串,而是來自文件,並在我想對其進行美化之前進行大量修改。
這個變壓器似乎是正確的方式,但我錯過了一些東西。你能告訴我,我做錯了什麼?
SSCCE輸出:
-- input -------------------
<asdf>
<a>text</a></asdf>
----------------------------
-- output ------------------
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<asdf>
<a>text</a>
</asdf>
----------------------------
預期輸出:
-- input -------------------
<asdf>
<a>text</a></asdf>
----------------------------
-- output ------------------
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<asdf>
<a>text</a>
</asdf>
----------------------------
感謝您的回答。它確實創造了不錯的產出。你能告訴我爲什麼'Transformer'方法不起作用嗎?我更喜歡使用'Transformer',因爲它位於'javax'分支中,而'OutputFormat'和'XMLSerializer'位於'com.sun.org.apache'分支中。 – brimborium
只需**使用變壓器上的'INDENT'屬性**即'''transformer.setOutputProperty(OutputKeys.INDENT,「yes」);' – Santosh
嗯,只設置縮進適用於這個例子,但不適合我的大一。如果有人能告訴我發生了什麼問題,我寧願使用'Transformer',在那之前,我會使用你的解決方案,這很好,但使用舊的包...;) – brimborium