In Java, come posso analizzare XML come stringa anziché come file?


249

Ho il codice seguente:

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

Come posso ottenere per analizzare XML contenuto in una stringa anziché in un file?


7
Inoltre, si javax.xml.parsers.DocumentBuilder.parse(string)presume che la stringa sia un uri (terribile ...)
Christophe Roussy,

Risposte:


479

Ho questa funzione nella mia base di codice, questo dovrebbe funzionare per te.

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

vedi anche questa domanda simile


3
@shsteimer Sto passando in stringa xml e restituisce null. Non genera alcuna eccezione. Cosa deve essere sbagliato?
sabato

@sattu: dovresti pubblicarlo come una nuova domanda. È davvero difficile dirlo senza vedere il tuo codice.
Alexander Malakhov,

grazie mille, mi ha salvato un sacco di righe di codice, lo stavo convertendo in testo ma sapevo che c'era un modo migliore!
nkuebelbeck

3
se ho <? XML> restituisce un nodo vuoto cosa posso fare?
Dejell,

1
Verifica di utilizzare la dichiarazione di importazione corretta:import org.xml.sax.InputSource;
Daniel Eisenreich,

18

Un modo consiste nell'utilizzare la versione di analisi che accetta un InputSource anziché un file

Un'origine input SAX può essere costruita da un oggetto Reader. Un oggetto Reader è StringReader

Quindi qualcosa del genere

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

5

javadocs mostra che il metodo di analisi è sovraccarico.

Crea un StringStream o InputSource usando il tuo XML di stringa e dovresti essere impostato.


4

Convertire la stringa in InputStream e passarla a DocumentBuilder

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

EDIT
In risposta alla bendin 's commento per quanto riguarda la codifica, vedi shsteimer ' la risposta a questa domanda s.


1
Preferirei StringReader perché evita String.getBytes (), ma di solito dovrebbe funzionare anche.
Michael Myers

3
Quando chiami getBytes (), quale codifica ti aspetti che utilizzi? Come stai dicendo al parser XML quale codifica sta ottenendo? Ti aspetti che indovini? Cosa succede quando ti trovi su una piattaforma in cui la codifica predefinita non è UTF-8?
Bendin,

2

Sto usando questo 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;
}

0

Puoi usare il pacchetto Scilca XML Progession disponibile su GitHub.

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

0

basta inserire

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.