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?


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


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. 

5

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

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


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.


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

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

0

po prostu wprowadź

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.