En Java, ¿cómo analizo XML como una cadena en lugar de un archivo?

249

Tengo el siguiente código:

DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile);

¿Cómo puedo hacer que analice XML contenido dentro de una cadena en lugar de un archivo?

Dewayne
fuente
77
También tenga en cuenta que se javax.xml.parsers.DocumentBuilder.parse(string)supone que la cadena es un uri (terrible ...)
Christophe Roussy

Respuestas:

479

Tengo esta función en mi base de código, esto debería funcionar para usted.

public static Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource is = new InputSource(new StringReader(xml));
    return builder.parse(is);
}

También vea esta pregunta similar

shsteimer
fuente
3
@shsteimer Estoy pasando una cadena xml y está devolviendo nulo. No arroja ninguna excepción. ¿Qué debe estar mal?
sábado
@sattu: debe publicarlo como una nueva pregunta. Es realmente difícil saberlo sin ver tu código.
Alexander Malakhov
muchas gracias, me ahorré muchas líneas de código, lo estaba volviendo a convertir en texto, ¡pero sabía que había una mejor manera!
nkuebelbeck
3
si tengo <? XML> devuelve un nodo vacío, ¿qué puedo hacer?
Dejell
1
Compruebe que utiliza la declaración de importación correcta:import org.xml.sax.InputSource;
Daniel Eisenreich
18

Una forma es usar la versión de parse que toma InputSource en lugar de un archivo

Un SAX InputSource se puede construir a partir de un objeto Reader. Un objeto Reader es el StringReader

Entonces algo como

parse(new InputSource(new StringReader(myString))) may work. 
Uri
fuente
5

Los javadocs muestran que el método de análisis está sobrecargado.

Cree un StringStream o InputSource utilizando su XML de cadena y debería estar configurado.

duffymo
fuente
4

Convierta la cadena en un InputStream y páselo a DocumentBuilder

final InputStream stream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
builder.parse(stream);

EDITAR
En respuesta al comentario de bendin sobre la codificación, vea la respuesta de shsteimer a esta pregunta.

Akbar ibrahim
fuente
1
Prefiero el StringReader porque evita String.getBytes (), pero esto generalmente debería funcionar también.
Michael Myers
3
Cuando llamas a getBytes (), ¿qué codificación esperas que use? ¿Cómo le está diciendo al analizador XML qué codificación está recibiendo? ¿Esperas que adivine? ¿Qué sucede cuando estás en una plataforma donde la codificación predeterminada no es UTF-8?
bendin
2

Estoy usando este metodo

public Document parseXmlFromString(String xmlString){
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputStream inputStream = new    ByteArrayInputStream(xmlString.getBytes());
    org.w3c.dom.Document document = builder.parse(inputStream);
    return document;
}
Yasir Shabbir Choudhary
fuente
0

Puede usar el paquete Scilca XML Progession disponible en GitHub.

XMLIterator xi = new VirtualXML.XMLIterator("<xml />");
XMLReader xr = new XMLReader(xi);
Document d = xr.parseDocument();
Shukant Pal
fuente
0

solo ingrese

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
lgb
fuente