代码之家  ›  专栏  ›  技术社区  ›  flybywire

将org.w3c.dom.document完美打印到stdout的最短方法是什么?

  •  91
  • flybywire  · 技术社区  · 14 年前

    最简单的打印方式是什么? org.w3c.dom.Document 停顿?

    6 回复  |  直到 8 年前
        1
  •  172
  •   Marco Lackovic    12 年前

    呼叫 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")));
    }
    

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

        2
  •  13
  •   informatik01 Viswanath Lekshmanan    8 年前

    怎么样:

    OutputFormat format = new OutputFormat(doc);
    format.setIndenting(true);
    XMLSerializer serializer = new XMLSerializer(System.out, format);
    serializer.serialize(doc);
    
        3
  •  10
  •   yegor256    10 年前

    尝试 jcabi-xml 有一个班轮:

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

    这是您需要的依赖关系:

    <dependency>
      <groupId>com.jcabi</groupId>
      <artifactId>jcabi-xml</artifactId>
      <version>0.14</version>
    </dependency>
    
        4
  •  3
  •   Robert Harvey    11 年前
    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 + "   ");
    }
    
        5
  •  1
  •   Mark    11 年前

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

    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);
    }
    
        6
  •  -1
  •   Rockoder    9 年前

    如果您使用dom4j,它将是dom4jdom.asstring()。