Tengo un org.w3c.dom.Element
objeto pasado a mi método. Necesito ver toda la cadena xml, incluidos sus nodos secundarios (todo el gráfico del objeto). Estoy buscando un método que pueda convertir el Element
en una cadena de formato xml que pueda System.out.println
. Solo println()
en el objeto 'Elemento' no funcionará porque toString()
no generará el formato xml y no pasará por su nodo secundario. ¿Existe una manera fácil sin escribir mi propio método para hacer eso? Gracias.
89
<?xml version="1.0" encoding="UTF-16"?>
la declaración molesta ... también podemos agregar esta líneaserializer .getDomConfig().setParameter("xml-declaration", false);
en la primera solución ....Código simple de 4 líneas para obtener
String
sin declaración xml (<?xml version="1.0" encoding="UTF-16"?>
) deorg.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);
fuente
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/
fuente
Si tiene el esquema del XML o puede crear enlaces JAXB para él, puede usar 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); } }
fuente
Pruebe jcabi-xml con una línea:
String xml = new XMLDocument(element).toString();
fuente
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!
fuente
Con VTD-XML , puede pasar al cursor y realizar una única llamada a 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 = "<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))); } } }
fuente