摘要:我想保存一个org.w3c.dom.Document
带有漂亮缩进的文件(漂亮地打印它)。以下带有 a 的代码Transformer
在某些情况下可以完成这项工作,但并非在所有情况下都可以(参见示例)。你能帮我解决这个问题吗?
我有一个org.w3c.dom.Document
(not 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
以便您可以在任何需要的地方轻松运行它(例如在 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>
----------------------------