Di Jawa, bagaimana cara mengurai XML sebagai String alih-alih file?

249

Saya memiliki kode berikut:

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

Bagaimana saya bisa mem-parsing XML yang terkandung dalam String, bukan file?

Dewayne
sumber
7
Perhatikan juga bahwa javax.xml.parsers.DocumentBuilder.parse(string)anggapan string adalah uri (mengerikan ...)
Christophe Roussy

Jawaban:

479

Saya memiliki fungsi ini di basis kode saya, ini harus bekerja untuk Anda.

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

juga lihat pertanyaan serupa ini

shsteimer
sumber
3
@shsteimer Saya melewati string xml dan mengembalikan nol. Itu tidak membuang pengecualian. Apa yang salah?
sattu
@sattu: Anda harus mempostingnya sebagai pertanyaan baru. Sangat sulit untuk mengetahui tanpa melihat kode Anda.
Alexander Malakhov
terima kasih banyak, menyelamatkan saya banyak baris kode, saya mengubahnya kembali ke teks tetapi saya tahu ada cara yang lebih baik!
nkuebelbeck
3
jika saya memiliki <? XML> itu mengembalikan simpul kosong apa yang bisa saya lakukan?
Dejell
1
Periksa apakah Anda menggunakan pernyataan impor yang benar:import org.xml.sax.InputSource;
Daniel Eisenreich
18

Salah satu caranya adalah dengan menggunakan versi parse yang mengambil InputSource daripada file

InputSource SAX dapat dibangun dari objek Reader. Satu objek Reader adalah StringReader

Jadi sesuatu seperti itu

parse(new InputSource(new StringReader(myString))) may work. 
Uri
sumber
5

javadocs menunjukkan bahwa metode parse kelebihan beban.

Buat StringStream atau InputSource menggunakan XML string Anda dan Anda harus mengatur.

Duffymo
sumber
4

Konversikan string ke InputStream dan berikan ke DocumentBuilder

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

EDIT
Sebagai tanggapan terhadap komentar bendin tentang penyandian, lihat jawaban shsteimer untuk pertanyaan ini.

Akbar ibrahim
sumber
1
Saya lebih suka StringReader karena menghindari String.getBytes (), tetapi ini biasanya juga berfungsi.
Michael Myers
3
Saat Anda memanggil getBytes (), penyandian apa yang Anda harapkan untuk digunakan? Bagaimana Anda memberi tahu parser XML yang penyandiannya didapat? Apakah Anda mengharapkannya menebak? Apa yang terjadi ketika Anda berada di platform di mana pengkodean default bukan UTF-8?
bendin
2

Saya menggunakan metode ini

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
sumber
0

Anda dapat menggunakan paket Scilca XML Progession yang tersedia di GitHub.

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

masukan saja

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
lgb
sumber