org.w3c.dom.Element를 Java의 문자열 형식으로 출력하는 방법은 무엇입니까?


90

org.w3c.dom.Element내 메서드에 전달 된 개체가 있습니다. 하위 노드 (전체 개체 그래프)를 포함하여 전체 xml 문자열을 확인해야합니다. 를 Elementxml 형식 문자열로 변환 할 수있는 방법을 찾고 있습니다 System.out.println. 그냥 println()'요소'개체에없는 일 때문에 것이다 toString()출력하지 XML 형식과 그 자식 노드를 통해 가지 않을 것입니다. 내 자신의 방법을 작성하지 않고 쉽게 할 수 있습니까? 감사.

답변:


156

표준 API를 고수하고 싶다고 가정하면 ...

DOMImplementationLS를 사용할 수 있습니다 .

Document document = node.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document
    .getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(node);

<? xml version = "1.0"encoding = "UTF-16"?> 선언이 신경 쓰이는 경우 대신 변환기 를 사용할 수 있습니다 .

TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node),
      new StreamResult(buffer));
String str = buffer.toString();

7
[html : null]을 얻고 HTML을 예상하는 경우 이것이 해결책입니다. Google이 답변을 색인화 할 수 있도록이 댓글을 추가했습니다.
Donal Tobin

3
여전히 LSSerializer를 사용하고 "UTF-8"을 출력 할 수 있습니다. 대신 StringWriter와 함께 LSOutput을 사용하고 인코딩 유형을 "UTF- * 8"로 설정하십시오
ricosrealm

1
w3c 문서 객체에서도 작동합니다
thirdy

2
<?xml version="1.0" encoding="UTF-16"?>선언 귀찮게은 ... 우리는 또한이 라인을 추가 할 수 있습니다 serializer .getDomConfig().setParameter("xml-declaration", false); .... 최초의 솔루션에
타셈 싱에게

답변 해 주셔서 감사합니다. 정말 좋습니다. 하지만 문제가 있습니다. 때로는 일치하는 부분의 일부 태그가 제거되고 그 텍스트 내용 만 표시됩니다. 이 문제에 대한 제안이 있습니까?
epcpu

16

String xml-declaration ( <?xml version="1.0" encoding="UTF-16"?>) 없이 얻을 수있는 간단한 4 줄 코드org.w3c.dom.Element

DOMImplementationLS lsImpl = (DOMImplementationLS)node.getOwnerDocument().getImplementation().getFeature("LS", "3.0");
LSSerializer serializer = lsImpl.createLSSerializer();
serializer.getDomConfig().setParameter("xml-declaration", false); //by default its true, so set it to false to get String without xml-declaration
String str = serializer.writeToString(node);

2

표준 JAXP API에서는 지원하지 않기 때문에이 목적으로 JDom 라이브러리를 사용했습니다. 프린터 기능, 포맷터 옵션 등이 있습니다. http://www.jdom.org/


표준 org.w3c.dom API의 의도가 아니기 때문에 +1. 텍스트로 XML 블록에 관심이있는 경우 일반적으로 정규식 일치가있는 텍스트로 구문 분석하려고합니다 (검색 기준이 정규식으로 쉽게 표현되는 경우).
Cornel Masson 2015 년

2

XML 스키마가 있거나 이에 대한 JAXB 바인딩을 만들 수있는 경우 JAXB Marshaller를 사용하여 System.out에 쓸 수 있습니다.

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRootElement
public class BoundClass {

    @XmlAttribute
    private String test;

    @XmlElement
    private int x;

    public BoundClass() {}

    public BoundClass(String test) {
        this.test = test;
    }

    public static void main(String[] args) throws Exception {
        JAXBContext jxbc = JAXBContext.newInstance(BoundClass.class);
        Marshaller marshaller = jxbc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshaller.marshal(new JAXBElement(new QName("root"),BoundClass.class,new Main("test")),System.out);
    }
}

2

하나의 라이너로 jcabi-xml 을 사용해보십시오 .

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

새 버전의 jcabi-xml은 요소를 매개 변수로 지원하지 않고 노드 / 파일 / 문자열 만 지원합니다.
Ermintar

1

이것은 jcabi에서 수행되는 작업입니다.

private String asString(Node node) {
    StringWriter writer = new StringWriter();
    try {
        Transformer trans = TransformerFactory.newInstance().newTransformer();
        // @checkstyle MultipleStringLiterals (1 line)
        trans.setOutputProperty(OutputKeys.INDENT, "yes");
        trans.setOutputProperty(OutputKeys.VERSION, "1.0");
        if (!(node instanceof Document)) {
            trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        }
        trans.transform(new DOMSource(node), new StreamResult(writer));
    } catch (final TransformerConfigurationException ex) {
        throw new IllegalStateException(ex);
    } catch (final TransformerException ex) {
        throw new IllegalArgumentException(ex);
    }
    return writer.toString();
}

그리고 그것은 나를 위해 작동합니다!


0

으로 VTD-XML , 커서로 전달할 수 (오프셋 및 길이는로 표시로) 세그먼트를 검색하는 하나의 getElementFragment 통화를 ... 다음은 예입니다

import com.ximpleware.*;
public class concatTest{
    public static void main(String s1[]) throws Exception {
        VTDGen vg= new VTDGen();
        String s = "<users><user><firstName>some </firstName><lastName> one</lastName></user></users>";
        vg.setDoc(s.getBytes());
        vg.parse(false);
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/users/user/firstName");
        int i=ap.evalXPath();
        if (i!=1){
            long l= vn.getElementFragment();
            System.out.println(" the segment is "+ vn.toString((int)l,(int)(l>>32)));
        }
    }

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