漂亮地将org.w3c.dom.Document打印到stdout的最短方法是什么?


103

org.w3c.dom.Document对标准输出进行漂亮打印(也称为格式化)的最简单方法是什么?

Answers:


186

调用printDocument(doc, System.out),该方法如下所示:

public static void printDocument(Document doc, OutputStream out) throws IOException, TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.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", "4");

    transformer.transform(new DOMSource(doc), 
         new StreamResult(new OutputStreamWriter(out, "UTF-8")));
}

(这indent-amount是可选的,可能不适用于您的特定配置)


64
具有讽刺意味的是,这是在Java中简单地打印XML文档的“最简单”方法吗?
托马斯

7
另一方面,您有很多控制权;)
Bozho 2011年

2
辉煌!是的,虽然文本很多,但是很清楚所选择的选项是什么,Eclipse / Netbeans确实可以帮助您编写此代码。给我看一个较小的版本,我告诉你它不能做什么。更糟糕的是,我会告诉您在哪里需要进行3次调试才能使其正确运行……
Peter Kriens 2013年

4
我向Java宣誓。.让我写一些荒谬的代码行,以便可以用另一种语言用另一种语言完成……也受完全控制
。.– l46kok

但是,如果您的XML包含星体字符,并且您正在使用Xalan,请注意issue.apache.org/jira/browse/XALANJ-2419,另请参见stackoverflow.com/a/11987283/1031689
JasonPlutext

13

怎么样:

OutputFormat format = new OutputFormat(doc);
format.setIndenting(true);
XMLSerializer serializer = new XMLSerializer(System.out, format);
serializer.serialize(doc);

8
虽然更简单,但此方法需要Xerces
Pace

3
我可以补充一点,今天不推荐使用XMLSerializer和OutputFormat
Vokail

9

尝试使用一种内衬的jcabi-xml

String xml = new XMLDocument(document).toString();

这是您需要的依赖项:

<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-xml</artifactId>
  <version>0.14</version>
</dependency>

4
private void printNode(Node rootNode, String spacer) {
    System.out.println(spacer + rootNode.getNodeName() + " -> " + rootNode.getNodeValue());
    NodeList nl = rootNode.getChildNodes();
    for (int i = 0; i < nl.getLength(); i++)
        printNode(nl.item(i), spacer + "   ");
}

1
我很感激Q要求的最短,但是(为了其他人的利益)也许您可以详细说明问题的答案?
安德鲁(Andrew)

html-> head-> meta-> title-> body->如果我在上面放置一个空格作为字符串,结果就是我得到的结果。它打算做什么?我认为,当需要印刷时,需要XML的完整印刷本。
jeraldfdo

0

通过使用递归下降/上升,这将返回格式正确的输出。

private static boolean skipNL;
private static String printXML(Node rootNode) {
    String tab = "";
    skipNL = false;
    return(printXML(rootNode, tab));
}
private static String printXML(Node rootNode, String tab) {
    String print = "";
    if(rootNode.getNodeType()==Node.ELEMENT_NODE) {
        print += "\n"+tab+"<"+rootNode.getNodeName()+">";
    }
    NodeList nl = rootNode.getChildNodes();
    if(nl.getLength()>0) {
        for (int i = 0; i < nl.getLength(); i++) {
            print += printXML(nl.item(i), tab+"  ");    // \t
        }
    } else {
        if(rootNode.getNodeValue()!=null) {
            print = rootNode.getNodeValue();
        }
        skipNL = true;
    }
    if(rootNode.getNodeType()==Node.ELEMENT_NODE) {
        if(!skipNL) {
            print += "\n"+tab;
        }
        skipNL = false;
        print += "</"+rootNode.getNodeName()+">";
    }
    return(print);
}

这是非常不完整的。
安德鲁(Andrew)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.