Sebenarnya Java mendukung 4 metode untuk mem-parsing XML di luar kotak:
DOM Parser / Builder: Seluruh struktur XML dimuat ke dalam memori dan Anda dapat menggunakan metode DOM yang terkenal untuk bekerja dengannya. DOM juga memungkinkan Anda untuk menulis ke dokumen dengan transformasi Xslt. Contoh:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
Parser SAX: Semata-mata untuk membaca dokumen XML. Pengurai Sax dijalankan melalui dokumen dan memanggil metode panggilan balik pengguna. Ada metode untuk memulai / mengakhiri dokumen, elemen dan sebagainya. Mereka didefinisikan dalam org.xml.sax.ContentHandler dan ada kelas helper DefaultHandler kosong.
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAx Reader / Writer: Ini bekerja dengan antarmuka berorientasi data. Program meminta elemen berikutnya ketika siap seperti kursor / iterator. Anda juga dapat membuat dokumen dengannya. Baca dokumen:
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
Menulis dokumen:
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB: Implementasi terbaru untuk membaca dokumen XML: Merupakan bagian dari Java 6 di v2. Ini memungkinkan kita untuk membuat serial objek java dari dokumen. Anda membaca dokumen dengan kelas yang mengimplementasikan antarmuka ke javax.xml.bind.Unmarshaller (Anda mendapatkan kelas untuk ini dari JAXBContext.newInstance). Konteksnya harus diinisialisasi dengan kelas yang digunakan, tetapi Anda hanya perlu menentukan kelas root dan tidak perlu khawatir tentang kelas referensi statis. Anda menggunakan anotasi untuk menentukan kelas mana yang harus elemen (@XmlRootElement) dan bidang mana yang elemen (@XmlElement) atau atribut (@XmlAttribute, sungguh kejutan!)
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
Menulis dokumen:
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
Contoh disalin tanpa malu-malu dari beberapa slide kuliah lama ;-)
Sunting: Tentang "API mana yang harus saya gunakan?". Yah itu tergantung - tidak semua API memiliki kemampuan yang sama seperti yang Anda lihat, tetapi jika Anda memiliki kendali atas kelas yang Anda gunakan untuk memetakan dokumen XML JAXB adalah solusi favorit saya, benar-benar elegan dan sederhana (meskipun saya belum menggunakannya untuk dokumen yang sangat besar, bisa jadi agak rumit). SAX juga cukup mudah digunakan dan menjauhlah dari DOM jika Anda tidak memiliki alasan yang bagus untuk menggunakannya - API yang kikuk menurut saya. Saya tidak berpikir ada perpustakaan pihak ke-3 modern yang menampilkan sesuatu yang sangat berguna yang hilang dari STL dan perpustakaan standar memiliki keuntungan yang biasa diuji dengan sangat baik, didokumentasikan dan stabil.