Cara Membaca dan Menulis File XML Dengan Java
Table of content:
File XML dapat melayani berbagai tujuan, termasuk penyimpanan data. Sebelum JSON menjadi populer, XML adalah format pilihan untuk merepresentasikan, menyimpan, dan mengangkut data terstruktur.
Meskipun popularitas XML telah berkurang dalam beberapa tahun terakhir, Anda mungkin akan menemukannya sesekali, jadi penting untuk mempelajari cara menggunakannya. Cari tahu cara menggunakan DOM API untuk membaca dan menulis file XML dengan Java.
Persyaratan untuk Memproses XML di Java
Java Standard Edition (SE) mencakup Java API for XML Processing (JAXP), yang merupakan istilah umum yang mencakup sebagian besar aspek pemrosesan XML. Ini termasuk:
- DOM: Model Objek Dokumen mencakup kelas untuk bekerja dengan objek XML seperti elemen, node, dan atribut. DOM API memuat dokumen XML lengkap ke dalam memori untuk diproses, sehingga tidak cocok untuk file XML besar.
- SAKSOFON: API Sederhana untuk XML adalah API berbasis peristiwa untuk membaca XML. Ini memicu peristiwa sebagai respons terhadap konten XML yang ditemukan saat mem-parsing file. Jejak memori metode ini rendah, namun bekerja dengan API lebih sulit daripada bekerja dengan DOM.
- StaX: Streaming API untuk XML adalah tambahan terbaru. Ini menyediakan pemfilteran aliran kinerja tinggi, pemrosesan, dan modifikasi XML. Meskipun menghindari memuat seluruh dokumen XML ke dalam memori, ia menyediakan arsitektur tipe tarik daripada arsitektur berbasis peristiwa, sehingga lebih mudah untuk membuat kode daripada SAX API.
Untuk memproses XML di Java, Anda perlu mengimpor paket berikut:
import javax.xml.parsers.*;
import javax.xml.transform.*;
import org.w3c.dom.*;
Mempersiapkan Contoh File XML
Untuk memahami kode contoh dan konsep di baliknya, gunakan contoh ini File XML dari Microsoft. Berikut kutipannya:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
...snipped...
Membaca File XML Dengan DOM API
Mari kita lihat langkah-langkah dasar yang diperlukan untuk membaca file XML menggunakan DOM API. Mulailah dengan membuat sebuah instance dari Pembuat Dokumen yang akan Anda gunakan untuk mengurai dokumen XML:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Anda sekarang dapat memuat seluruh dokumen ke dalam memori, mulai dari elemen root XML. Dalam contoh kita, itu adalah katalog elemen.
File file = "<path_to_file>";
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();
Dan itu saja; Anda sekarang memiliki akses ke seluruh dokumen XML mulai dari elemen akarnya, katalog.
Sekarang setelah Anda memiliki elemen root XML, Anda dapat menggunakan DOM API untuk mengekstrak sejumlah informasi menarik. Misalnya, dapatkan semuanya buku anak-anak dari elemen root dan ulangi mereka. Perhatikan itu dapatkanChildNodes() mengembalikan semua anak, termasuk teks, komentar, dll. Untuk tujuan Anda, Anda hanya memerlukan elemen anak, sehingga Anda dapat melewati yang lain:
NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i < n ; i++) {
Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
}
Bagaimana Anda menemukan elemen anak tertentu, berdasarkan induknya? Buat metode statis yang mengembalikan elemen pertama yang cocok jika ditemukan, atau null. Prosedurnya melibatkan mendapatkan daftar node anak dan mengulanginya untuk memilih node elemen dengan nama yang ditentukan.
static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i < in ; i++) {
Node child = children.item(i);
if (child.getNodeType() != Node.ELEMENT_NODE)
continue;
if (child.getNodeName().equals(tagName))
return child;
}
return null;
}
Perhatikan bahwa DOM API memperlakukan konten teks dalam elemen sebagai tipe simpul terpisah TEXT_NODE. Konten teks dapat terdiri dari beberapa node teks yang berdekatan, jadi Anda memerlukan beberapa pemrosesan khusus untuk mengambil teks suatu elemen:
static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k < kn ; k++) {
Node child = children.item(k);
if (child.getNodeType() != Node.TEXT_NODE)
break;
text.append(child.getNodeValue());
}
return text.toString();
}
Berbekal fungsi praktis ini, lihat kode ini untuk mencantumkan beberapa informasi dari contoh XML. Ini menunjukkan informasi rinci untuk setiap buku yang tersedia dalam katalog:
NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i < n ; i++) {
Node child = books.item(i);
if (child.getNodeType() != Node.ELEMENT_NODE)
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute(“id”);
String author = getCharacterData(findFirstNamedElement(child, “author”));
String title = getCharacterData(findFirstNamedElement(child, “title”));
String genre = getCharacterData(findFirstNamedElement(child, “genre”));
String price = getCharacterData(findFirstNamedElement(child, “price”));
String pubdate = getCharacterData(findFirstNamedElement(child, “pubdate”));
String descr = getCharacterData(findFirstNamedElement(child, “description”));
System.out.printf(“%3d. book id = %s\n” +
” author: %s\n” +
” title: %s\n” +
” genre: %s\n” +
” price: %s\n” +
” pubdate: %s\n” +
” descr: %s\n”,
ii, id, author, title, genre, price, pubdate, descr);
}
Berikut penjelasan kode langkah demi langkah:
- Kode diiterasi melalui node anak katalogelemen akar.
- Untuk setiap node anak, yang mewakili sebuah buku, ia memeriksa apakah tipe node tersebut adalah an ELEMENT_NODE. Jika tidak, maka dilanjutkan ke iterasi berikutnya.
- Jika simpul anak adalah ELEMENT_NODE, (Elemen)anak melemparkannya ke objek Elemen.
- Kode tersebut kemudian mengekstrak berbagai atribut dan data karakter dari elemen buku, termasuk “id”, “penulis”, “judul”, “genre”, “harga”, “tanggal pub”, dan “deskripsi”. Ini mencetak data ini menggunakan Sistem.keluar.printf metode.
Berikut tampilan outputnya:
Menulis Output XML Menggunakan Transform API
Java menyediakan API Transformasi XML untuk mengubah data XML. Kami menggunakan API ini dengan identitas mengubah untuk menghasilkan keluaran. Sebagai contoh, mari kita tambahkan yang baru buku elemen ke katalog sampel yang disajikan di atas.
Anda mungkin memperoleh detail buku (penulis, judul, dll.) dari sumber eksternal, seperti file properti atau database. Anda dapat menggunakan file properti berikut sebagai contoh:
id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description="It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife." So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.
Langkah pertama adalah mengurai file XML yang ada menggunakan metode di atas:
File file = ...;
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();
Sekarang Anda memuat data dari file properti menggunakan Properti kelas yang disediakan di Java. Kodenya cukup sederhana:
String propsFile = "<path_to_file>";
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}
Setelah memuat properti, Anda dapat mengambil nilai yang ingin Anda tambahkan dari file properti:
String id = props.getProperty("id");
String author = props.getProperty("author");
String title = props.getProperty("title");
String genre = props.getProperty("genre");
String price = props.getProperty("price");
String publish_date = props.getProperty("publish_date");
String descr = props.getProperty("description");
Sekarang, buat yang kosong buku elemen.
Element book = document.createElement("book");
book.setAttribute("id", id);
Menambahkan elemen anak ke buku itu sepele. Untuk kenyamanan, Anda dapat mengumpulkan nama elemen yang diperlukan di a Daftar dan tambahkan nilai dalam satu lingkaran.
List<String> elnames =Arrays.asList("author", "title", "genre", "price",
"publish_date", "description");
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);
Itu katalog elemen sekarang memiliki yang baru buku elemen ditambahkan. Yang tersisa sekarang hanyalah menulis XML yang diperbarui.
Untuk menulis XML, Anda memerlukan sebuah instance Transformator yang dapat Anda buat seperti ini:
TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, "yes");
tform.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
Anda dapat menggunakan setOutputProperti() untuk meminta indentasi output.
Langkah terakhir adalah menerapkan transformasi. Hasilnya muncul di aliran keluaran, Sistem.keluar.
tform.transform(new DOMSource(document), new StreamResult(System.out));
Untuk menulis output langsung ke file, gunakan yang berikut ini:
tform.transform(new DOMSource(document), new StreamResult(new File("output.xml")));
Itu saja langkah-langkah yang Anda perlukan untuk membaca dan menulis file XML di Java.
Sekarang Anda Tahu Cara Membaca dan Menulis File XML Dengan Java
Mengurai dan memanipulasi XML dengan Java adalah keterampilan berharga yang sering Anda gunakan dalam program dunia nyata. DOM dan Transform API sangat berguna.
Memahami DOM, khususnya, sangat penting jika Anda berencana menulis kode sisi klien untuk aplikasi web atau situs. Antarmuka DOM bersifat universal, sehingga Anda dapat menggunakannya menggunakan kode serupa dalam berbagai bahasa seperti Java dan JavaScript.