2009-02-18 11 views
199

Tengo el siguiente código:En Java, ¿cómo analizo XML como una cadena en lugar de un archivo?

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

¿Cómo puedo conseguirlo para analizar XML contenida dentro de una cadena en lugar de un archivo?

+3

También tenga en cuenta que 'javax.xml.parsers.DocumentBuilder.parse (cadena)' asume la cadena es un URI (horrible ...) –

Respuesta

406

Tengo esta función en mi código base, 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 ver this similar question

+0

@shsteimer Estoy pasando una cadena xml y está devolviendo nulo. No arroja ninguna excepción. ¿Qué debe estar mal? – sattu

+0

@sattu: debe publicarlo como una nueva pregunta. Es realmente difícil de decir sin ver tu código. –

+0

muchas gracias, me salvó un montón de líneas de código, lo estaba convirtiendo de nuevo en texto, pero sabía que había una mejor manera. – nkuebelbeck

5

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

Cree un StringStream o InputSource utilizando su cadena XML y debe establecerlo.

15

Una forma es utilizar la versión de análisis sintáctico que toma un InputSource en lugar de un archivo

Un SAX InputSource puede ser construido a partir de un objeto Reader. Un objeto Reader es el StringReader

así que algo como

parse(new InputSource(new StringReader(myString))) may work. 
+0

muy buena. Gracias – IndieBoy

4

convertir la cadena en un InputStream y pasarlo a DocumentBuilder

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

EDITAR
En respuesta a bendin 's comentario con respecto a la codificación, vea shsteimer's la respuesta a esta pregunta.

+1

Preferiría el StringReader porque evita String.getBytes(), pero esto debería * normalmente * funcionar también. –

+3

Cuando llama a getBytes(), ¿qué codificación espera que use? ¿Cómo le está diciendo al analizador XML qué codificación está obteniendo? ¿Esperas que adivine? ¿Qué sucede cuando estás en una plataforma donde la codificación predeterminada no es UTF-8? – bendin

1

estoy usando este método

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; 
} 
0

Puede utilizar el paquete Scilca XML Progession disponible en GitHub.

XMLIterator xi = new VirtualXML.XMLIterator("<xml />"); 
XMLReader xr = new XMLReader(xi); 
Document d = xr.parseDocument(); 
Cuestiones relacionadas