2009-08-02 8 views
81

Ich habe ein org.w3c.dom.Element Objekt in meine Methode übergeben. Ich muss die gesamte XML-Zeichenkette einschließlich ihrer Kindknoten (das gesamte Objektdiagramm) sehen. Ich bin auf der Suche nach einer Methode, die die Element in eine XML-Formatzeichenfolge konvertieren kann, die ich System.out.println on kann. Nur println() auf dem 'Element' Objekt wird nicht funktionieren, weil toString() nicht das XML-Format ausgeben und nicht durch seinen Kind-Knoten gehen wird. Gibt es einen einfachen Weg, ohne meine eigene Methode zu schreiben? Vielen Dank.Wie ich org.w3c.dom.Element in String-Format in Java ausgeben?

Antwort

1

In der Standard-JAXP-API nicht unterstützt, habe ich die JDom-Bibliothek für diesen Zweck verwendet. Es verfügt über eine Druckerfunktion, Formatter Optionen usw. http://www.jdom.org/

+0

+1 für das ist nicht die Absicht der Standard-API org.w3c.dom. Wenn ich mich für XML-Blöcke als Text interessiere, versuche ich normalerweise, sie als Text mit einer Regex-Übereinstimmung zu analysieren (wenn das Suchkriterium einfach als Regex dargestellt wird). –

145

Vorausgesetzt, dass Sie mit dem Standard-API halten wollen ...

Sie eine DOMImplementationLS verwenden:?

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

Wenn die < xml version = "1.0" encoding = "UTF-16"? > Erklärung stört Sie, können Sie eine transformer stattdessen verwenden könnte:

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

Dies ist die Lösung, wenn Sie [html: null] erhalten und HTML erwarten. Dieser Kommentar wurde hinzugefügt, damit Google die Antwort hoffentlich indizieren kann. –

+2

Sie können weiterhin LSSerializer verwenden und "UTF-8" ausgeben. Verwenden Sie stattdessen LSOutput mit StringWriter und setzen Sie den Codierungstyp auf "UTF- * 8" – ricosrealm

+1

Funktioniert mit w3c Dokumentobjekt sowie – thirdy

2

Wenn Sie das Schema des XML oder kann sonst JAXB Bindungen für sie erstellen, könnten Sie die JAXB Marshaller zu System.out schreiben verwenden:

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

Einfache 4 Zeilen Code Stringohne XML-Deklaration (<?xml version="1.0" encoding="UTF-16"?>) von org.w3c.dom.Element

zu erhalten 10
1

Versuchen jcabi-xml mit Motto:

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

Mit VTD-XML, können Sie in den Cursor passieren und einen einzigen getElementFragment Anruf das Segment abgerufen werden (wie bezeichnet durch seine Offset und Länge) ... Im Folgenden finden ein Beispiel

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("https://stackoverflow.com/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))); 
     } 
    } 

} 
0

dies ist das, was in jcabi getan:

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

und es funktioniert für mich!

Verwandte Themen