¿Cómo salgo org.w3c.dom.Element al formato de cadena en java?

Tengo un objeto org.w3c.dom.Element pasado a mi método. Necesito ver toda la cadena xml incluyendo sus nodos secundarios (el gráfico completo del objeto). Estoy buscando un método que pueda convertir el Element en una cadena de formato xml en la que pueda System.out.println . Simplemente println() en el objeto ‘Elemento’ no funcionará porque toString() no generará el formato xml y no pasará por su nodo hijo. ¿Hay una manera fácil sin escribir mi propio método para hacer eso? Gracias.

Asumiendo que quieres seguir con la API estándar …

Podría usar un DOMImplementationLS :

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

Si la statement < ? Xml version = "1.0" encoding = "UTF-16"?> Te molesta, podrías usar un transformador en su lugar:

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

Código simple de 4 líneas para obtener String sin statement-xml ( < ?xml version="1.0" encoding="UTF-16"?> ) De 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); 

Si tiene el esquema del XML o puede crear enlaces JAXB para él, puede usar el JAXB Marshaller para escribir en 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); } } 

No es compatible con la API JAXP estándar, utilicé la biblioteca JDom para este propósito. Tiene una función de impresora, opciones de formateador, etc. http://www.jdom.org/

Pruebe jcabi-xml con un trazador de líneas:

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

Con VTD-XML , puede pasar al cursor y hacer una sola llamada getElementFragment para recuperar el segmento (como se indica por su desplazamiento y longitud) … A continuación se muestra un ejemplo

 import com.ximpleware.*; public class concatTest{ public static void main(String s1[]) throws Exception { VTDGen vg= new VTDGen(); String s = "some  one"; 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))); } } } 

esto es lo que se hace en 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(); } 

¡Y funciona para mi!