Wie analysiere ich in Java XML als Zeichenfolge anstelle einer Datei?


249

Ich habe folgenden Code:

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

Wie kann ich XML in einem String anstelle einer Datei analysieren?


7
Beachten Sie auch, dass javax.xml.parsers.DocumentBuilder.parse(string)davon ausgegangen wird , dass die Saite ein Uri ist (schrecklich ...)
Christophe Roussy

Antworten:


479

Ich habe diese Funktion in meiner Codebasis, dies sollte für Sie funktionieren.

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

siehe auch diese ähnliche Frage


3
@shsteimer Ich übergebe eine XML-Zeichenfolge und es wird null zurückgegeben. Es gibt keine Ausnahme. Was muss falsch sein?
Sattu

@sattu: Du solltest es als neue Frage posten. Es ist wirklich schwer zu sagen, ohne Ihren Code zu sehen.
Alexander Malakhov

Vielen Dank, ich habe mir eine Menge Code gespart, ich habe ihn wieder in Text konvertiert, aber ich wusste, dass es einen besseren Weg gibt!
Nkuebelbeck

3
Wenn ich <? XML> habe, wird ein leerer Knoten zurückgegeben. Was kann ich tun?
Dejell

1
Überprüfen Sie, ob Sie die richtige Importanweisung verwenden:import org.xml.sax.InputSource;
Daniel Eisenreich

18

Eine Möglichkeit besteht darin, die Analyseversion zu verwenden, die eine InputSource anstelle einer Datei verwendet

Eine SAX InputSource kann aus einem Reader-Objekt erstellt werden. Ein Reader-Objekt ist der StringReader

Also so etwas wie

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

5

Javadocs zeigen, dass die Analysemethode überladen ist.

Erstellen Sie einen StringStream oder eine InputSource mit Ihrem String-XML, und Sie sollten festgelegt sein.


4

Konvertieren Sie die Zeichenfolge in einen InputStream und übergeben Sie sie an DocumentBuilder

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

EDIT
Als Antwort auf bendin ‚s Kommentar bezüglich Codierung finden shsteimer ‘ s Antwort auf diese Frage.


1
Ich würde den StringReader bevorzugen, da er String.getBytes () vermeidet, aber dies sollte normalerweise auch funktionieren.
Michael Myers

3
Welche Codierung erwarten Sie, wenn Sie getBytes () aufrufen? Wie können Sie dem XML-Parser mitteilen, welche Codierung er erhält? Erwarten Sie es zu erraten? Was passiert, wenn Sie sich auf einer Plattform befinden, auf der die Standardcodierung nicht UTF-8 ist?
Bendin

2

Ich benutze diese Methode

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

Sie können das bei GitHub verfügbare Scilca XML Progession-Paket verwenden.

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

0

einfach eingeben

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.