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
それがJavaでXMLドキュメントを単に印刷する「最も簡単な」方法であることは皮肉なことではありませんか?
トーマス

7
一方、あなたは十分なコントロールを持っています;)
Bozho

2
鮮やかさ!そして、はい、それは少し多くのテキストですが、選択されたオプションが何であるかは非常に明確であり、Eclipse / Netbeansはこれを書くのに本当に役立ちます。小さいバージョンを見せてください、それができないことを教えます。さらに悪いことに、それを正しく行うために3つのデバッグラウンドが必要な場所を教えてくれます...
Peter Kriens 2013年

4
私は神Javaに誓います..他の言語で1つまたは2つで実行できる何かのためのばかげた数のコード行を記述させます...フルコントロールでも..
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

1つのライナーで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

-1

dom4jを使用する場合、dom4JDOM.asString()になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.