【问题标题】:Prettify XML in org.w3c.dom.Document to file将 org.w3c.dom.Document 中的 XML 美化为文件
【发布时间】:2012-09-18 12:50:15
【问题描述】:

总结:我想将org.w3c.dom.Document 保存到缩进很好的文件中(打印出来很漂亮)。以下带有Transformer 的代码在某些情况下可以完成这项工作,但并非在所有情况下都可以(参见示例)。你能帮我解决这个问题吗?

我有一个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,一切都很好。而且文档通常不是来自字符串,而是来自文件,并且在我想要美化它之前会被大量修改。

这个 Transformer 似乎是正确的方法,但我错过了一些东西。你能告诉我,我做错了什么吗?

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>
----------------------------

【问题讨论】:

    标签: java xml pretty-print


    【解决方案1】:

    试试这个:

    需要org.apache.xml.serialize.XMLSerializerorg.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 方法不起作用吗?我更喜欢使用Transformer,因为它在javax 分支中,而OutputFormatXMLSerializercom.sun.org.apache 分支中。
    • 只需尝试transformer 上使用INDENT 属性,即transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    • 嗯,仅设置缩进适用于本示例,但不适用于我的大示例。如果有人能告诉我出了什么问题,我宁愿使用Transformer,在那之前,我会使用你的解决方案,它工作得很好,但使用旧包......;)
    • 好的,我恢复使用TransformerFactory。但是这里的这个答案提供了一个有效的解决方案来解决这个问题。唯一的缺点是它使用了一个我不喜欢的非官方分支。无论如何,接受有用的答案。感谢您的输入。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多