Saya memiliki dokumen XML lengkap dalam sebuah string dan menginginkan sebuah Document
objek. Google menemukan semua jenis sampah. Apa solusi paling sederhana? (Di Java 1.5)
Solusi Terima kasih kepada Matt McMinn , saya telah menetapkan penerapan ini. Ini memiliki tingkat fleksibilitas masukan dan perincian pengecualian yang tepat untuk saya. (Senang mengetahui apakah kesalahan tersebut berasal dari format XML yang salah - SAXException
- atau hanya IO yang buruk - IOException
.)
public static org.w3c.dom.Document loadXMLFrom(String xml)
throws org.xml.sax.SAXException, java.io.IOException {
return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes()));
}
public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is)
throws org.xml.sax.SAXException, java.io.IOException {
javax.xml.parsers.DocumentBuilderFactory factory =
javax.xml.parsers.DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
javax.xml.parsers.DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
}
catch (javax.xml.parsers.ParserConfigurationException ex) {
}
org.w3c.dom.Document doc = builder.parse(is);
is.close();
return doc;
}
Jawaban:
Ini berfungsi untuk saya di Java 1.5 - Saya menghapus pengecualian khusus untuk keterbacaan.
sumber
getBytes()
tanpa pertimbangan untuk pengkodean.return (Document) builder.parse(new ByteArrayInputStream(xml.getBytes()));
??Siapa disana!
Ada masalah yang berpotensi serius dengan kode ini, karena kode ini mengabaikan pengkodean karakter yang ditentukan dalam
String
(yang merupakan UTF-8 secara default). Saat Anda memanggilString.getBytes()
platform, pengkodean default digunakan untuk mengenkode karakter Unicode menjadi byte. Jadi, pengurai mungkin berpikir itu mendapatkan data UTF-8 padahal sebenarnya itu mendapatkan EBCDIC atau sesuatu… tidak bagus!Sebagai gantinya, gunakan metode parse yang menggunakan InputSource, yang dapat dibuat dengan Reader, seperti ini:
Ini mungkin tidak tampak seperti masalah besar, tetapi ketidaktahuan tentang masalah pengkodean karakter menyebabkan pembusukan kode berbahaya seperti y2k.
sumber
Baru saja mengalami masalah serupa, kecuali saya membutuhkan NodeList dan bukan Dokumen, inilah yang saya dapatkan. Ini sebagian besar solusi yang sama seperti sebelumnya, ditambah untuk mendapatkan elemen root sebagai NodeList dan menggunakan saran erickson untuk menggunakan InputSource sebagai gantinya untuk masalah pengkodean karakter.
sumber
Untuk memanipulasi XML di Java, saya selalu cenderung menggunakan Transformer API:
sumber