read parseo org node java xml document w3c

org - parseo de xml en java



¿Cómo cargo un org.w3c.dom.Document desde XML en una cadena? (4)

Tengo un documento XML completo en una cadena y me gustaría un objeto de Document . Google aparece todo tipo de basura. ¿Cuál es la solución más simple? (En Java 1.5)

Solución Gracias a Matt McMinn , me he decidido por esta implementación. Tiene el nivel correcto de flexibilidad de entrada y granularidad de excepción para mí. (Es bueno saber si el error proviene de XML con formato incorrecto - SAXException - o simplemente IO - IOException malo).

public static org.w3c.dom.Document loadXMLFrom(String xml) throws org.xml.sax.SAXException, java.io.IOException { return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes())); } public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is) throws org.xml.sax.SAXException, java.io.IOException { javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); javax.xml.parsers.DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (javax.xml.parsers.ParserConfigurationException ex) { } org.w3c.dom.Document doc = builder.parse(is); is.close(); return doc; }


¡Whoa allí!

Existe un problema potencialmente grave con este código, ya que ignora la codificación de caracteres especificada en la String (que es UTF-8 de forma predeterminada). Cuando llama a String.getBytes() la codificación predeterminada de la plataforma se utiliza para codificar caracteres Unicode en bytes. Por lo tanto, el analizador puede pensar que está obteniendo datos UTF-8 cuando en realidad está recibiendo EBCDIC o algo así ... ¡no es bonito!

En su lugar, use el método de análisis que toma un InputSource, que se puede construir con un Reader, como este:

import java.io.StringReader; import org.xml.sax.InputSource; … return builder.parse(new InputSource(new StringReader(xml)));

Puede que no parezca un gran problema, pero la ignorancia de los problemas de codificación de los caracteres lleva a la corrupción del código insidioso similar a Y2k.


Esto funciona para mí en Java 1.5. Eliminé excepciones específicas para la legibilidad.

import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import java.io.ByteArrayInputStream; public Document loadXMLFromString(String xml) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); return builder.parse(new ByteArrayInputStream(xml.getBytes())); }


Para manipular XML en Java, siempre tiendo a usar la API de Transformador:

import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.stream.StreamSource; public static Document loadXMLFrom(String xml) throws TransformerException { Source source = new StreamSource(new StringReader(xml)); DOMResult result = new DOMResult(); TransformerFactory.newInstance().newTransformer().transform(source , result); return (Document) result.getNode(); }


Solo tuve un problema similar, excepto que necesitaba una NodeList y no un Documento, esto es lo que se me ocurrió. En su mayoría es la misma solución que antes, aumentada para obtener el elemento raíz como NodeList y utilizando la sugerencia de erickson de utilizar un InputSource en lugar de problemas de codificación de caracteres.

private String DOC_ROOT="root"; String xml=getXmlString(); Document xmlDoc=loadXMLFrom(xml); Element template=xmlDoc.getDocumentElement(); NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT); public static Document loadXMLFrom(String xml) throws Exception { InputSource is= new InputSource(new StringReader(xml)); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = null; builder = factory.newDocumentBuilder(); Document doc = builder.parse(is); return doc; }