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.