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.