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 문서를 간단히 인쇄하는 "가장 쉬운"방법이라는 것이 아이러니하지 않습니까?
Thomas

7
반면에 당신은 많은 통제권을 가지고 있습니다;)
Bozho

2
훌륭한! 그리고 예, 약간의 텍스트이지만 선택한 옵션이 무엇인지 명확하고 Eclipse / Netbeans가 실제로 이것을 작성하는 데 도움이됩니다. 더 작은 버전을 보여 주시면 할 수없는 일을 말씀 드리겠습니다. 당신이 바로 그걸 얻기 위해 3 디버깅 라운드를 필요로하는 곳에 더 나쁜, 나는 당신을 말할 것이다 ...
피터 크리 엔스 (Kriens)

4
나는 ... .. 신 자바 맹세 나를 너무 완벽하게 제어 할 하나 또는 다른 언어로 두에서 수행 할 수있는 무언가에 대한 코드 라인 ... 터무니 번호를 기재하게
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이 더 이상 사용되지
않는다고

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

이것은 매우 불완전합니다.
앤드류

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.