Tengo un documento XML completo en una cadena y me gustaría un Document
objeto. Google muestra todo tipo de basura. Cual es la solucion mas simple? (En Java 1.5)
Solución Gracias a Matt McMinn , me he decidido por esta implementación. Tiene el nivel adecuado de flexibilidad de entrada y granularidad de excepciones para mí. (Es bueno saber si el error provino de un XML con formato incorrecto SAXException
, o simplemente de una E / S incorrecta IOException
).
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;
}
Respuestas:
Esto funciona para mí en Java 1.5: eliminé las excepciones específicas para mejorar la legibilidad.
fuente
getBytes()
sin tener en cuenta la codificación.return (Document) builder.parse(new ByteArrayInputStream(xml.getBytes()));
?¡Vaya!
Hay un problema potencialmente serio con este código, porque ignora la codificación de caracteres especificada en
String
(que es UTF-8 por defecto). Cuando llama aString.getBytes()
la plataforma, la codificación predeterminada se utiliza para codificar caracteres Unicode en bytes. Entonces, el analizador puede pensar que está obteniendo datos UTF-8 cuando en realidad está obteniendo EBCDIC o algo ... ¡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:
Puede que no parezca gran cosa, pero la ignorancia de los problemas de codificación de caracteres conduce a una corrupción de código insidiosa similar a y2k.
fuente
Acabo de tener un problema similar, excepto que necesitaba una NodeList y no un Documento, esto es lo que se me ocurrió. Es principalmente la misma solución que antes, aumentada para obtener el elemento raíz como NodeList y usar la sugerencia de Erickson de usar InputSource en lugar de problemas de codificación de caracteres.
fuente
Para manipular XML en Java, siempre tiendo a usar la API de Transformer:
fuente