Jak w Javie parsować XML jako ciąg zamiast pliku?

249

Mam następujący kod:

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

Jak mogę go parsować XML zawarty w ciągu zamiast w pliku?

Dewayne
źródło
7
Zauważ też, że javax.xml.parsers.DocumentBuilder.parse(string)zakładam, że sznurek jest uri (straszne ...)
Christophe Roussy

Odpowiedzi:

479

Mam tę funkcję w mojej bazie kodu, to powinno działać dla ciebie.

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

zobacz także podobne pytanie

shsteimer
źródło
3
@shsteimer Podaję ciąg xml i zwraca wartość null. Nie rzuca to żadnego wyjątku. Co musi być nie tak?
sattu
@sattu: Powinieneś opublikować to jako nowe pytanie. Naprawdę trudno powiedzieć bez obejrzenia kodu.
Alexander Malakhov
wielkie dzięki, uratowałem mi kilka wierszy kodu, przekształcałem go z powrotem na tekst, ale wiedziałem, że jest lepszy sposób!
nkuebelbeck
3
jeśli mam <? XML>, zwraca pusty węzeł, co mogę zrobić?
Dejell
1
Sprawdź, czy używasz właściwej instrukcji importu:import org.xml.sax.InputSource;
Daniel Eisenreich,
18

Jednym ze sposobów jest użycie wersji parsowania, która pobiera InputSource zamiast pliku

Źródło wejściowe SAX można zbudować z obiektu Reader. Jednym z obiektów Reader jest StringReader

Coś w stylu

parse(new InputSource(new StringReader(myString))) may work. 
Uri
źródło
5

javadocs pokazują, że metoda analizy jest przeciążona.

Utwórz StringStream lub InputSource za pomocą łańcucha XML i powinieneś być ustawiony.

duffymo
źródło
4

Konwertuj ciąg na InputStream i przekaż go do DocumentBuilder

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

EDYCJA
W odpowiedzi na komentarz Bendina dotyczący kodowania zobacz odpowiedź shsteimera na to pytanie.

Akbar ibrahim
źródło
1
Wolałbym StringReader, ponieważ unika String.getBytes (), ale zwykle powinno to również działać.
Michael Myers
3
Kiedy wywołasz getBytes (), jakiego kodowania oczekujesz? Jak mówisz parserowi XML, które kodowanie się pobiera? Czy spodziewasz się, że to zgadnie? Co dzieje się, gdy jesteś na platformie, na której domyślnym kodowaniem nie jest UTF-8?
bendin
2

Używam tej metody

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
źródło
0

Możesz użyć pakietu Scilca XML Progession dostępnego na GitHub.

XMLIterator xi = new VirtualXML.XMLIterator("<xml />");
XMLReader xr = new XMLReader(xi);
Document d = xr.parseDocument();
Shukant Pal
źródło
0

po prostu wprowadź

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
lgb
źródło