2009-08-02 10 views
81

Mam obiekt org.w3c.dom.Element przekazany do mojej metody. Potrzebuję zobaczyć cały ciąg xml, w tym jego węzły podrzędne (cały wykres obiektów). Szukam metody, która może przekonwertować Element na ciąg w formacie xml, który mogę System.out.println na. Po prostu println() na obiekcie "Element" nie będzie działać, ponieważ toString() nie wypisze pliku xml i nie przejdzie przez jego węzeł potomny. Czy istnieje prosty sposób, bez pisania własnej metody, aby to zrobić? Dzięki.Jak wyświetlić plik org.w3c.dom.Element w formacie ciągu znaków w języku Java?

Odpowiedz

1

Nieobsługiwany w standardowym interfejsie API JAXP, użyłem w tym celu biblioteki JDom. Posiada funkcję drukarki, opcje formater itp http://www.jdom.org/

+0

+1, ponieważ nie jest to zamierzeniem standardowego interfejsu API org.w3c.dom. Jeśli interesują mnie bloki XML jako tekst, zazwyczaj próbuję je sparsować jako tekst z dopasowaniem do wyrażenia regularnego (jeśli kryteria wyszukiwania są łatwo reprezentowane jako wyrażenie regularne). –

145

Zakładając, że chcemy pozostać przy standardowym API ...

można użyć DOMImplementationLS:

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

Jeśli < xml version = "1.0" encoding = "UTF-16"? > deklaracja przeszkadza, można użyć transformer zamiast:

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

Jest to rozwiązanie, jeśli otrzymujesz [html: null] i oczekujesz kodu HTML. Dodał ten komentarz, aby google mógł indeksować odpowiedź z nadzieją. –

+2

Nadal można używać LSSerializer i wyprowadzać "UTF-8". Zamiast tego użyj LSOutput z StringWriter i ustaw typ kodowania na "UTF- * 8" – ricosrealm

+1

Działa z obiektem Dokumentu w3c, jak również – thirdy

2

Jeśli masz schematu XML lub może w inny sposób tworzenia powiązań JAXB do niego, można użyć JAXB naziemnego napisać do 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); 
    } 
} 
12

Prosty kod 4 linie, aby uzyskać Stringbez xml-deklaracji (<?xml version="1.0" encoding="UTF-16"?>) od 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); 
1

Spróbuj jcabi-xml z jedną wkładką:

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

Z VTD-XML, można przejść do kursora i wykonać jedną rozmowę getElementFragment odzyskać segment (jak oznaczono przez jego przesunięcie i długość) ... Poniżej jest przykładem

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

to, co odbywa się w 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(); 
} 

i to działa dla mnie!

Powiązane problemy