Який найкоротший спосіб гарненько роздрукувати org.w3c.dom.Document to stdout?


103

Який найпростіший спосіб симпатичного друку (він же відформатований) org.w3c.dom.Documentна stdout?

Відповіді:


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
Чи не іронічно, що це "найпростіший" спосіб просто надрукувати XML-документ на Java?
Томас

7
з іншого боку, у вас є достатній контроль;)
Божо

2
Блискуче! І так, це трохи більше тексту, але зрозуміло, які обрані варіанти є, і Eclipse / Netbeans дійсно допоможуть вам написати це. Покажіть мені меншу версію, і я скажу вам, що вона не може зробити. Гірше, я скажу вам, де вам потрібно 3 раунди налагодження, щоб виправити це ...
Пітер Криенс

4
Присягаюсь, що Бог Java .. змусить мене написати смішну кількість рядків коду для чогось, що можна зробити однією або двома іншими мовами ... з повним контролем теж ..
l46kok

Але якщо ваш XML містить астральні символи, і ви використовуєте Xalan, зверніть увагу issues.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
Я розумію, що питання запитує про найкоротший, але (на користь будь-кого іншого), можливо, ви могли б розробити свою відповідь, щоб пояснити, що відбувається?
Андрій

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

Це дуже неповно.
Андрій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.