Bir org.w3c.dom.Document'i stdout'a yazdırmanın en kısa yolu nedir?


103

org.w3c.dom.DocumentA'dan stdout'a güzelce yazdırmanın (diğer bir deyişle biçimlendirilmiş) en kolay yolu nedir ?

Yanıtlar:


186

Çağrı printDocument(doc, System.out), bu yöntemin şöyle göründüğü yerde:

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İsteğe bağlıdır ve belirli yapılandırmanızla çalışmayabilir)


64
Java'da bir XML belgesini basitçe yazdırmanın "en kolay" yolunun bu olması ironik değil mi?
Thomas

7
Öte yandan çok fazla kontrole sahipsiniz;)
Bozho

2
Parlak! Ve evet, biraz fazla metin ama seçilen seçeneklerin ne olduğu çok açık ve Eclipse / Netbeans bunu yazmanıza gerçekten yardımcı oluyor. Bana daha küçük bir versiyon gösterin ve size ne yapamayacağını söyleyeyim. Daha da kötüsü, doğru yapmak için nerede 3 hata ayıklama turuna ihtiyacınız olduğunu söyleyeceğim ...
Peter Kriens

4
Tanrı Java'ya yemin ederim .. başka dillerde de bir veya iki dilde yapılabilecek bir şey için gülünç sayıda kod satırı
yazmamı sağla

Ancak XML'iniz astral karakterler içeriyorsa ve Xalan kullanıyorsanız, issues.apache.org/jira/browse/XALANJ-2419'u not edin ve ayrıca stackoverflow.com/a/11987283/1031689
JasonPlutext

13

Peki ya:

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

8
Daha kolay olsa da, bu yaklaşım Xerces
Pace

3
Bugün XMLSerializer ve OutputFormat'ın kullanımdan kaldırıldığını ekleyebilirim
Vokail

9

Jcabi-xml'yi tek astarla deneyin :

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

İhtiyacınız olan bağımlılık budur:

<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'nun en kısayı istediğini anlıyorum, ancak (başka birinin yararına) belki de neler olduğunu açıklamak için cevabınızı detaylandırabilirsiniz?
Andrew

html -> head -> meta -> title -> body -> Yukarıdaki boşluk bırakıcı olarak bir dize boşluğu yerleştirirsem sonuç elde ederim. Yapmak istediği şey bu mu? XML'nin tam bir baskısı, bence oldukça basılmış anlamına geldiğinde ihtiyaç duyulan şeydir.
jeraldfdo

0

Bu, yinelemeli iniş / çıkış kullanarak güzel biçimlendirilmiş bir çıktı döndürecektir.

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);
}

Bu çok eksik.
Andrew

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.