Java 将org.w3c.dom.Document中的XML美化为文件

Java 将org.w3c.dom.Document中的XML美化为文件,java,xml,pretty-print,Java,Xml,Pretty Print,摘要:我想将org.w3c.dom.Document保存到缩进良好的文件中(漂亮地打印出来)。以下带有变压器的代码在某些情况下起作用,但并非在所有情况下都起作用(参见示例)。你能帮我修一下吗? 我有一个org.w3c.dom.Document(不是org.jdom.Document),我想自动将其格式化并打印到文件中。我该怎么做?我尝试了这个方法,但如果文档中有其他换行符,它就不起作用: import java.io.ByteArrayInputStream; import javax.xml

摘要:我想将
org.w3c.dom.Document
保存到缩进良好的文件中(漂亮地打印出来)。以下带有
变压器的代码
在某些情况下起作用,但并非在所有情况下都起作用(参见示例)。你能帮我修一下吗?

我有一个
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) {}
    }
}
预期产出:

-- input -------------------
<asdf>

<a>text</a></asdf>
----------------------------
-- output ------------------
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<asdf>    
  <a>text</a>
</asdf>
----------------------------
——输入-------------------
文本
----------------------------
--输出------------------
文本
----------------------------
试试这个:

它需要
org.apache.xml.serialize.XMLSerializer
org.apache.xml.serialize.OutputFormat

OutputFormat format = new OutputFormat(document); //document is an instance of org.w3c.dom.Document
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, format);
serializer.serialize(document);

String formattedXML = out.toString();
试试这个:

它需要
org.apache.xml.serialize.XMLSerializer
org.apache.xml.serialize.OutputFormat

OutputFormat format = new OutputFormat(document); //document is an instance of org.w3c.dom.Document
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, format);
serializer.serialize(document);

String formattedXML = out.toString();

谢谢你的回答。它确实创造了很好的输出。你能告诉我为什么
变压器
方法不起作用吗?我更喜欢使用
Transformer
,因为它位于
javax
分支中,而
OutputFormat
XMLSerializer
位于
com.sun.org.apache
分支中。只需尝试在
Transformer
上使用
INDENT
属性即可,即
Transformer.setOutputProperty(OutputKeys.INDENT),“是的”)
Hm,仅设置缩进对本例有效,但对我的大示例无效。如果有人能告诉我出了什么问题,我更愿意使用
转换器
,在那之前,我将使用您的解决方案,该解决方案非常有效,但使用的是旧包…;)好的,我又回到了使用
TransformerFactory
。但这个答案他没有回答re提供了一个有效的解决方案来解决问题。唯一的缺点是它使用了一个我不喜欢的非官方分支。无论如何,请接受有用的答案。谢谢你的输入。:)谢谢你的回答。它确实产生了很好的输出。你能告诉我为什么
Transformer
方法不起作用吗?我更喜欢使用
ttransformer
因为它位于
javax
分支中,而
OutputFormat
XMLSerializer
位于
com.sun.org.apache
分支中。只需尝试在
transformer
上使用
INDENT
属性,即
transformer.setOutputProperty(OutputKeys.INDENT,“是”)
Hm,仅设置缩进对本例有效,但对我的大示例无效。如果有人能告诉我出了什么问题,我更愿意使用
转换器
,在那之前,我将使用您的解决方案,该解决方案非常有效,但使用的是旧包…;)好的,我又回到了使用
TransformerFactory
。但这个答案他没有回答re提供了一个解决问题的有效解决方案。唯一的缺点是它使用了非官方分支,我不喜欢。无论如何,接受有用的答案。感谢您的输入。:)