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?


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


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. 

5

javadocs menunjukkan bahwa metode parse kelebihan beban.

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


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.


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

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

0

masukan saja

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.