Java XML - Panduan Cepat
Apa itu XML?
XML adalah bahasa berbasis teks sederhana yang dirancang untuk menyimpan dan mengangkut data dalam format teks biasa. Itu singkatan dari Extensible Markup Language. Berikut adalah beberapa fitur penting XML.
XML adalah bahasa markup.
XML adalah bahasa berbasis tag seperti HTML.
Tag XML tidak ditentukan sebelumnya seperti HTML.
Anda dapat menentukan tag Anda sendiri, itulah sebabnya ini disebut bahasa yang dapat diperluas.
Tag XML dirancang untuk mendeskripsikan diri sendiri.
XML adalah Rekomendasi W3C untuk penyimpanan data dan transfer data.
Contoh
<?xml version = "1.0"?>
<Class>
<Name>First</Name>
<Sections>
<Section>
<Name>A</Name>
<Students>
<Student>Rohan</Student>
<Student>Mohan</Student>
<Student>Sohan</Student>
<Student>Lalit</Student>
<Student>Vinay</Student>
</Students>
</Section>
<Section>
<Name>B</Name>
<Students>
<Student>Robert</Student>
<Student>Julie</Student>
<Student>Kalie</Student>
<Student>Michael</Student>
</Students>
</Section>
</Sections>
</Class>
Keuntungan
Berikut adalah keuntungan yang diberikan XML -
Technology agnostic- Menjadi teks biasa, XML tidak bergantung pada teknologi. Ini dapat digunakan oleh teknologi apa pun untuk penyimpanan data dan tujuan transfer data.
Human readable- XML ​​menggunakan format teks sederhana. Itu bisa dibaca dan dimengerti manusia.
Extensible - Dalam XML, tag kustom dapat dibuat dan digunakan dengan sangat mudah.
Allow Validation - Menggunakan struktur XSD, DTD dan XML dapat divalidasi dengan mudah.
Kekurangan
Berikut adalah kerugian menggunakan XML -
Redundant Syntax - Biasanya file XML berisi banyak istilah berulang.
Verbose - Menjadi bahasa verbose, ukuran file XML meningkatkan biaya transmisi dan penyimpanan.
XML Parsing mengacu pada dokumen XML untuk mengakses atau mengubah data.
Apa itu XML Parser?
XML Parser menyediakan cara untuk mengakses atau mengubah data dalam dokumen XML. Java menyediakan beberapa opsi untuk mengurai dokumen XML. Berikut adalah berbagai jenis parser yang biasa digunakan untuk mengurai dokumen XML.
Dom Parser - Parsing dokumen XML dengan memuat konten lengkap dokumen dan membuat pohon hierarki lengkapnya di memori.
SAX Parser- Mengurai dokumen XML pada pemicu berbasis peristiwa. Tidak memuat dokumen lengkap ke dalam memori.
JDOM Parser - Mengurai dokumen XML dengan cara yang mirip dengan parser DOM tetapi dengan cara yang lebih mudah.
StAX Parser - Mengurai dokumen XML dengan cara yang mirip dengan parser SAX tetapi dengan cara yang lebih efisien.
XPath Parser - Parsing dokumen XML berdasarkan ekspresi dan digunakan secara luas dalam hubungannya dengan XSLT.
DOM4J Parser- Pustaka java untuk mengurai XML, XPath, dan XSLT menggunakan Java Collections Framework. Ini memberikan dukungan untuk DOM, SAX, dan JAXP.
Ada JAXB dan XSLT API yang tersedia untuk menangani penguraian XML dengan cara berorientasi objek. Kami akan menguraikan setiap parser secara detail di bab-bab selanjutnya dari tutorial ini.
Model Objek Dokumen (DOM) adalah rekomendasi resmi dari World Wide Web Consortium (W3C). Ini mendefinisikan antarmuka yang memungkinkan program untuk mengakses dan memperbarui gaya, struktur, dan konten dokumen XML. Pengurai XML yang mendukung DOM mengimplementasikan antarmuka ini.
Kapan Menggunakan?
Anda harus menggunakan pengurai DOM ketika -
Anda perlu tahu banyak tentang struktur dokumen.
Anda perlu memindahkan bagian-bagian dokumen XML (Anda mungkin ingin mengurutkan elemen tertentu, misalnya).
Anda perlu menggunakan informasi dalam dokumen XML lebih dari sekali.
Apa yang kau dapatkan?
Saat Anda mengurai dokumen XML dengan parser DOM, Anda mendapatkan kembali struktur pohon yang berisi semua elemen dokumen Anda. DOM menyediakan berbagai fungsi yang dapat Anda gunakan untuk memeriksa konten dan struktur dokumen.
Keuntungan
DOM adalah antarmuka umum untuk memanipulasi struktur dokumen. Salah satu tujuan desainnya adalah bahwa kode Java yang ditulis untuk satu parser yang sesuai dengan DOM harus berjalan pada parser lain yang sesuai dengan DOM tanpa harus melakukan modifikasi apa pun.
Antarmuka DOM
DOM mendefinisikan beberapa antarmuka Java. Berikut adalah antarmuka yang paling umum -
Node - Jenis data dasar DOM.
Element - Sebagian besar objek yang akan Anda tangani adalah Elemen.
Attr - Merupakan atribut dari suatu elemen.
Text - Isi sebenarnya dari suatu Elemen atau Attr.
Document- Mewakili seluruh dokumen XML. Objek Dokumen sering disebut sebagai pohon DOM.
Metode DOM umum
Saat Anda bekerja dengan DOM, ada beberapa metode yang akan sering Anda gunakan -
Document.getDocumentElement() - Mengembalikan elemen root dari dokumen.
Node.getFirstChild() - Mengembalikan anak pertama dari Node tertentu.
Node.getLastChild() - Mengembalikan anak terakhir dari Node tertentu.
Node.getNextSibling() - Metode ini mengembalikan saudara berikutnya dari Node tertentu.
Node.getPreviousSibling() - Metode ini mengembalikan saudara sebelumnya dari Node tertentu.
Node.getAttribute(attrName) - Untuk Node tertentu, ia mengembalikan atribut dengan nama yang diminta.
Langkah-langkah untuk Menggunakan JDOM
Berikut adalah langkah-langkah yang digunakan saat mengurai dokumen menggunakan JDOM Parser.
- Impor paket terkait XML.
- Buat DocumentBuilder
- Buat Dokumen dari file atau aliran
- Ekstrak elemen root
- Periksa atributnya
- Periksa sub-elemen
Impor paket terkait XML
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
Buat DocumentBuilder
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Buat Dokumen dari file atau aliran
StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version="1.0"?>
");
ByteArrayInputStream input = new ByteArrayInputStream(
xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);
Ekstrak elemen root
Element root = document.getDocumentElement();
Periksa atributnya
//returns specific attribute
getAttribute("attributeName");
//returns a Map (table) of names/values
getAttributes();
Periksa sub-elemen
//returns a list of subelements of specified name
getElementsByTagName("subelementName");
//returns a list of all child nodes
getChildNodes();
Contoh Demo
Berikut adalah file input xml yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
DomParserDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
public class DomParserDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("student");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Student roll no : "
+ eElement.getAttribute("rollno"));
System.out.println("First Name : "
+ eElement
.getElementsByTagName("firstname")
.item(0)
.getTextContent());
System.out.println("Last Name : "
+ eElement
.getElementsByTagName("lastname")
.item(0)
.getTextContent());
System.out.println("Nick Name : "
+ eElement
.getElementsByTagName("nickname")
.item(0)
.getTextContent());
System.out.println("Marks : "
+ eElement
.getElementsByTagName("marks")
.item(0)
.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Root element :class
----------------------------
Current Element :student
Student roll no : 393
First Name : dinkar
Last Name : kad
Nick Name : dinkar
Marks : 85
Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95
Current Element :student
Student roll no : 593
First Name : jasvir
Last Name : singn
Nick Name : jazz
Marks : 90
Contoh Demo
Berikut adalah file input xml yang perlu kita kueri -
<?xml version = "1.0"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferarri 101</carname>
<carname type = "sports car">Ferarri 201</carname>
<carname type = "sports car">Ferarri 301</carname>
</supercars>
<supercars company = "Lamborgini">
<carname>Lamborgini 001</carname>
<carname>Lamborgini 002</carname>
<carname>Lamborgini 003</carname>
</supercars>
<luxurycars company = "Benteley">
<carname>Benteley 1</carname>
<carname>Benteley 2</carname>
<carname>Benteley 3</carname>
</luxurycars>
</cars>
QueryXmlFileDemo.java
package com.tutorialspoint.xml;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
public class QueryXmlFileDemo {
public static void main(String argv[]) {
try {
File inputFile = new File("input.txt");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
System.out.print("Root element: ");
System.out.println(doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("supercars");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :");
System.out.print(nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.print("company : ");
System.out.println(eElement.getAttribute("company"));
NodeList carNameList = eElement.getElementsByTagName("carname");
for (int count = 0; count < carNameList.getLength(); count++) {
Node node1 = carNameList.item(count);
if (node1.getNodeType() == node1.ELEMENT_NODE) {
Element car = (Element) node1;
System.out.print("car name : ");
System.out.println(car.getTextContent());
System.out.print("car type : ");
System.out.println(car.getAttribute("type"));
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Root element: cars
----------------------------
Current Element :
supercarscompany : Ferrari
car name : Ferarri 101
car type : formula one
car name : Ferarri 201
car type : sports car
car name : Ferarri 301
car type : sports car
Current Element :
supercarscompany : Lamborgini
car name : Lamborgini 001
car type :
car name : Lamborgini 002
car type :
car name : Lamborgini 003
car type :
Contoh Demo
Berikut adalah XML yang perlu kita buat -
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
CreateXmlFileDemo.java
package com.tutorialspoint.xml;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.File;
public class CreateXmlFileDemo {
public static void main(String argv[]) {
try {
DocumentBuilderFactory dbFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.newDocument();
// root element
Element rootElement = doc.createElement("cars");
doc.appendChild(rootElement);
// supercars element
Element supercar = doc.createElement("supercars");
rootElement.appendChild(supercar);
// setting attribute to element
Attr attr = doc.createAttribute("company");
attr.setValue("Ferrari");
supercar.setAttributeNode(attr);
// carname element
Element carname = doc.createElement("carname");
Attr attrType = doc.createAttribute("type");
attrType.setValue("formula one");
carname.setAttributeNode(attrType);
carname.appendChild(doc.createTextNode("Ferrari 101"));
supercar.appendChild(carname);
Element carname1 = doc.createElement("carname");
Attr attrType1 = doc.createAttribute("type");
attrType1.setValue("sports");
carname1.setAttributeNode(attrType1);
carname1.appendChild(doc.createTextNode("Ferrari 202"));
supercar.appendChild(carname1);
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("C:\\cars.xml"));
transformer.transform(source, result);
// Output to console for testing
StreamResult consoleResult = new StreamResult(System.out);
transformer.transform(source, consoleResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
Contoh Demo
Berikut adalah file input xml yang perlu kita modifikasi -
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
<luxurycars company = "Benteley">
<carname>Benteley 1</carname>
<carname>Benteley 2</carname>
<carname>Benteley 3</carname>
</luxurycars>
</cars>
ModifyXmlFileDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class ModifyXmlFileDemo {
public static void main(String argv[]) {
try {
File inputFile = new File("input.xml");
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(inputFile);
Node cars = doc.getFirstChild();
Node supercar = doc.getElementsByTagName("supercars").item(0);
// update supercar attribute
NamedNodeMap attr = supercar.getAttributes();
Node nodeAttr = attr.getNamedItem("company");
nodeAttr.setTextContent("Lamborigini");
// loop the supercar child node
NodeList list = supercar.getChildNodes();
for (int temp = 0; temp < list.getLength(); temp++) {
Node node = list.item(temp);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node;
if ("carname".equals(eElement.getNodeName())) {
if("Ferrari 101".equals(eElement.getTextContent())) {
eElement.setTextContent("Lamborigini 001");
}
if("Ferrari 202".equals(eElement.getTextContent()))
eElement.setTextContent("Lamborigini 002");
}
}
}
NodeList childNodes = cars.getChildNodes();
for(int count = 0; count < childNodes.getLength(); count++) {
Node node = childNodes.item(count);
if("luxurycars".equals(node.getNodeName()))
cars.removeChild(node);
}
// write the content on console
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
System.out.println("-----------Modified File-----------");
StreamResult consoleResult = new StreamResult(System.out);
transformer.transform(source, consoleResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
-----------Modified File-----------
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Lamborigini">
<carname type = "formula one">Lamborigini 001</carname>
<carname type = "sports">Lamborigini 002</carname>
</supercars>
</cars>
SAX (Simple API untuk XML) adalah pengurai berbasis peristiwa untuk dokumen XML. Tidak seperti parser DOM, parser SAX tidak membuat pohon parse. SAX adalah antarmuka streaming untuk XML, yang berarti bahwa aplikasi yang menggunakan SAX menerima pemberitahuan peristiwa tentang dokumen XML yang sedang memproses elemen, dan atribut, pada waktu yang berurutan mulai dari bagian atas dokumen, dan diakhiri dengan penutupan Elemen ROOT.
Membaca dokumen XML dari atas ke bawah, mengenali token yang menyusun dokumen XML dengan format yang baik.
Token diproses dalam urutan yang sama seperti yang muncul di dokumen.
Melaporkan program aplikasi sifat token yang ditemukan oleh parser saat terjadi.
Program aplikasi menyediakan penangan "event" yang harus didaftarkan dengan parser.
Saat token diidentifikasi, metode callback di handler dipanggil dengan informasi yang relevan.
Kapan Menggunakan?
Anda harus menggunakan parser SAX jika -
Anda dapat memproses dokumen XML secara linier dari atas ke bawah.
Dokumen tidak bertumpuk secara mendalam.
Anda sedang memproses dokumen XML yang sangat besar yang pohon DOMnya akan menghabiskan terlalu banyak memori. Implementasi DOM tipikal menggunakan sepuluh byte memori untuk mewakili satu byte XML.
Masalah yang harus dipecahkan hanya melibatkan sebagian dari dokumen XML.
Data tersedia segera setelah dilihat oleh parser, jadi SAX berfungsi dengan baik untuk dokumen XML yang masuk melalui aliran.
Kekurangan SAX
Kami tidak memiliki akses acak ke dokumen XML karena diproses dengan cara hanya meneruskan.
Jika Anda perlu melacak data yang telah dilihat oleh parser atau mengubah urutan item, Anda harus menulis kode dan menyimpan datanya sendiri.
Antarmuka ContentHandler
Antarmuka ini menetapkan metode callback yang digunakan parser SAX untuk memberi tahu program aplikasi komponen dokumen XML yang telah dilihatnya.
void startDocument() - Disebut di awal dokumen.
void endDocument() - Disebut di akhir dokumen.
void startElement(String uri, String localName, String qName, Attributes atts) - Disebut di awal elemen.
void endElement(String uri, String localName,String qName) - Disebut di akhir elemen.
void characters(char[] ch, int start, int length) - Dipanggil ketika data karakter ditemukan.
void ignorableWhitespace( char[] ch, int start, int length) - Dipanggil saat DTD hadir dan spasi kosong yang dapat diabaikan ditemukan.
void processingInstruction(String target, String data) - Dipanggil ketika instruksi pemrosesan dikenali.
void setDocumentLocator(Locator locator)) - Menyediakan Locator yang dapat digunakan untuk mengidentifikasi posisi dalam dokumen.
void skippedEntity(String name) - Dipanggil ketika ditemukan entitas yang belum terselesaikan.
void startPrefixMapping(String prefix, String uri) - Dipanggil saat pemetaan namespace baru ditentukan.
void endPrefixMapping(String prefix) - Dipanggil ketika definisi namespace mengakhiri cakupannya.
Atribut Antarmuka
Antarmuka ini menetapkan metode untuk memproses atribut yang terhubung ke elemen.
int getLength() - Mengembalikan jumlah atribut.
String getQName(int index)
String getValue(int index)
String getValue(String qname)
Contoh Demo
Berikut adalah file input xml yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
UserHandler.java
package com.tutorialspoint.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class UserHandler extends DefaultHandler {
boolean bFirstName = false;
boolean bLastName = false;
boolean bNickName = false;
boolean bMarks = false;
@Override
public void startElement(String uri,
String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("student")) {
String rollNo = attributes.getValue("rollno");
System.out.println("Roll No : " + rollNo);
} else if (qName.equalsIgnoreCase("firstname")) {
bFirstName = true;
} else if (qName.equalsIgnoreCase("lastname")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("nickname")) {
bNickName = true;
}
else if (qName.equalsIgnoreCase("marks")) {
bMarks = true;
}
}
@Override
public void endElement(String uri,
String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("student")) {
System.out.println("End Element :" + qName);
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (bFirstName) {
System.out.println("First Name: "
+ new String(ch, start, length));
bFirstName = false;
} else if (bLastName) {
System.out.println("Last Name: " + new String(ch, start, length));
bLastName = false;
} else if (bNickName) {
System.out.println("Nick Name: " + new String(ch, start, length));
bNickName = false;
} else if (bMarks) {
System.out.println("Marks: " + new String(ch, start, length));
bMarks = false;
}
}
}
SAXParserDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
UserHandler userhandler = new UserHandler();
saxParser.parse(inputFile, userhandler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class UserHandler extends DefaultHandler {
boolean bFirstName = false;
boolean bLastName = false;
boolean bNickName = false;
boolean bMarks = false;
@Override
public void startElement(
String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equalsIgnoreCase("student")) {
String rollNo = attributes.getValue("rollno");
System.out.println("Roll No : " + rollNo);
} else if (qName.equalsIgnoreCase("firstname")) {
bFirstName = true;
} else if (qName.equalsIgnoreCase("lastname")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("nickname")) {
bNickName = true;
}
else if (qName.equalsIgnoreCase("marks")) {
bMarks = true;
}
}
@Override
public void endElement(String uri,
String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("student")) {
System.out.println("End Element :" + qName);
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (bFirstName) {
System.out.println("First Name: " + new String(ch, start, length));
bFirstName = false;
} else if (bLastName) {
System.out.println("Last Name: " + new String(ch, start, length));
bLastName = false;
} else if (bNickName) {
System.out.println("Nick Name: " + new String(ch, start, length));
bNickName = false;
} else if (bMarks) {
System.out.println("Marks: " + new String(ch, start, length));
bMarks = false;
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Roll No : 393
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element :student
Roll No : 493
First Name: Vaneet
Last Name: Gupta
Nick Name: vinni
Marks: 95
End Element :student
Roll No : 593
First Name: jasvir
Last Name: singn
Nick Name: jazz
Marks: 90
End Element :student
Contoh Demo
Berikut adalah file teks input yang kita perlukan untuk Query for rollno: 393
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
UserHandler.java
package com.tutorialspoint.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class UserHandler extends DefaultHandler {
boolean bFirstName = false;
boolean bLastName = false;
boolean bNickName = false;
boolean bMarks = false;
String rollNo = null;
@Override
public void startElement(
String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equalsIgnoreCase("student")) {
rollNo = attributes.getValue("rollno");
}
if(("393").equals(rollNo) &&
qName.equalsIgnoreCase("student")) {
System.out.println("Start Element :" + qName);
}
if (qName.equalsIgnoreCase("firstname")) {
bFirstName = true;
} else if (qName.equalsIgnoreCase("lastname")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("nickname")) {
bNickName = true;
}
else if (qName.equalsIgnoreCase("marks")) {
bMarks = true;
}
}
@Override
public void endElement(
String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("student")) {
if(("393").equals(rollNo) && qName.equalsIgnoreCase("student"))
System.out.println("End Element :" + qName);
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (bFirstName && ("393").equals(rollNo)) {
//age element, set Employee age
System.out.println("First Name: " + new String(ch, start, length));
bFirstName = false;
} else if (bLastName && ("393").equals(rollNo)) {
System.out.println("Last Name: " + new String(ch, start, length));
bLastName = false;
} else if (bNickName && ("393").equals(rollNo)) {
System.out.println("Nick Name: " + new String(ch, start, length));
bNickName = false;
} else if (bMarks && ("393").equals(rollNo)) {
System.out.println("Marks: " + new String(ch, start, length));
bMarks = false;
}
}
}
SAXQueryDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXQueryDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
UserHandler userhandler = new UserHandler();
saxParser.parse(inputFile, userhandler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class UserHandler extends DefaultHandler {
boolean bFirstName = false;
boolean bLastName = false;
boolean bNickName = false;
boolean bMarks = false;
String rollNo = null;
@Override
public void startElement(String uri,
String localName, String qName, Attributes attributes)
throws SAXException {
if (qName.equalsIgnoreCase("student")) {
rollNo = attributes.getValue("rollno");
}
if(("393").equals(rollNo) && qName.equalsIgnoreCase("student")) {
System.out.println("Start Element :" + qName);
}
if (qName.equalsIgnoreCase("firstname")) {
bFirstName = true;
} else if (qName.equalsIgnoreCase("lastname")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("nickname")) {
bNickName = true;
}
else if (qName.equalsIgnoreCase("marks")) {
bMarks = true;
}
}
@Override
public void endElement(
String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("student")) {
if(("393").equals(rollNo)
&& qName.equalsIgnoreCase("student"))
System.out.println("End Element :" + qName);
}
}
@Override
public void characters(
char ch[], int start, int length) throws SAXException {
if (bFirstName && ("393").equals(rollNo)) {
//age element, set Employee age
System.out.println("First Name: " + new String(ch, start, length));
bFirstName = false;
} else if (bLastName && ("393").equals(rollNo)) {
System.out.println("Last Name: " + new String(ch, start, length));
bLastName = false;
} else if (bNickName && ("393").equals(rollNo)) {
System.out.println("Nick Name: " + new String(ch, start, length));
bNickName = false;
} else if (bMarks && ("393").equals(rollNo)) {
System.out.println("Marks: " + new String(ch, start, length));
bMarks = false;
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Start Element :student
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element :student
It is better to use StAX parser for creating XML documents rather than using SAX parser. Please refer the Java StAX Parser section for the same.
Contoh Demo
Berikut adalah file XML masukan yang perlu kita modifikasi dengan menambahkan <Result> Pass <Result /> di akhir tag </marks>.
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
SAXModifyDemo.java
package com.tutorialspoint.xml;
import java.io.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import org.xml.sax.helpers.DefaultHandler;
public class SAXModifyDemo extends DefaultHandler {
static String displayText[] = new String[1000];
static int numberLines = 0;
static String indentation = "";
public static void main(String args[]) {
try {
File inputFile = new File("input.txt");
SAXParserFactory factory =
SAXParserFactory.newInstance();
SAXModifyDemo obj = new SAXModifyDemo();
obj.childLoop(inputFile);
FileWriter filewriter = new FileWriter("newfile.xml");
for(int loopIndex = 0; loopIndex < numberLines; loopIndex++) {
filewriter.write(displayText[loopIndex].toCharArray());
filewriter.write('\n');
System.out.println(displayText[loopIndex].toString());
}
filewriter.close();
}
catch (Exception e) {
e.printStackTrace(System.err);
}
}
public void childLoop(File input) {
DefaultHandler handler = this;
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(input, handler);
} catch (Throwable t) {}
}
public void startDocument() {
displayText[numberLines] = indentation;
displayText[numberLines] += "<?xml version = \"1.0\" encoding = \""+
"UTF-8" + "\"?>";
numberLines++;
}
public void processingInstruction(String target, String data) {
displayText[numberLines] = indentation;
displayText[numberLines] += "<?";
displayText[numberLines] += target;
if (data != null && data.length() > 0) {
displayText[numberLines] += ' ';
displayText[numberLines] += data;
}
displayText[numberLines] += "?>";
numberLines++;
}
public void startElement(String uri, String localName, String qualifiedName,
Attributes attributes) {
displayText[numberLines] = indentation;
indentation += " ";
displayText[numberLines] += '<';
displayText[numberLines] += qualifiedName;
if (attributes != null) {
int numberAttributes = attributes.getLength();
for (int loopIndex = 0; loopIndex < numberAttributes; loopIndex++) {
displayText[numberLines] += ' ';
displayText[numberLines] += attributes.getQName(loopIndex);
displayText[numberLines] += "=\"";
displayText[numberLines] += attributes.getValue(loopIndex);
displayText[numberLines] += '"';
}
}
displayText[numberLines] += '>';
numberLines++;
}
public void characters(char characters[], int start, int length) {
String characterData = (new String(characters, start, length)).trim();
if(characterData.indexOf("\n") < 0 && characterData.length() > 0) {
displayText[numberLines] = indentation;
displayText[numberLines] += characterData;
numberLines++;
}
}
public void endElement(String uri, String localName, String qualifiedName) {
indentation = indentation.substring(0, indentation.length() - 4) ;
displayText[numberLines] = indentation;
displayText[numberLines] += "</";
displayText[numberLines] += qualifiedName;
displayText[numberLines] += '>';
numberLines++;
if (qualifiedName.equals("marks")) {
startElement("", "Result", "Result", null);
characters("Pass".toCharArray(), 0, "Pass".length());
endElement("", "Result", "Result");
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8"?>
<class>
<student rollno = "393">
<firstname>
dinkar
</firstname>
<lastname>
kad
</lastname>
<nickname>
dinkar
</nickname>
<marks>
85
</marks>
<Result>
Pass
</Result>
</student>
<student rollno = "493">
<firstname>
Vaneet
</firstname>
<lastname>
Gupta
</lastname>
<nickname>
vinni
</nickname>
<marks>
95
</marks>
<Result>
Pass
</Result>
</student>
<student rollno = "593">
<firstname>
jasvir
</firstname>
<lastname>
singn
</lastname>
<nickname>
jazz
</nickname>
<marks>
90
</marks>
<Result>
Pass
</Result>
</student>
</class>
JDOM adalah perpustakaan open source berbasis Java untuk mengurai dokumen XML. Ini biasanya merupakan API ramah pengembang Java. Ini dioptimalkan untuk Java dan menggunakan koleksi Java seperti List dan Array.
JDOM bekerja dengan DOM dan SAX API dan menggabungkan yang terbaik dari keduanya. Ini memiliki jejak memori yang rendah dan hampir secepat SAX.
Pengaturan Lingkungan
Untuk menggunakan parser JDOM, Anda harus memiliki jdom.jar di classpath aplikasi Anda. Unduh jdom-2.0.5.zip.
Kapan Menggunakan?
Anda harus menggunakan parser JDOM ketika -
Anda perlu tahu banyak tentang struktur dokumen XML.
Anda perlu memindahkan bagian-bagian dari dokumen XMl (Anda mungkin ingin mengurutkan elemen tertentu, misalnya).
Anda perlu menggunakan informasi dalam dokumen XML lebih dari sekali.
Anda adalah pengembang Java dan ingin memanfaatkan penguraian XML yang dioptimalkan untuk Java.
Apa yang kau dapatkan?
Saat Anda mengurai dokumen XML dengan parser JDOM, Anda mendapatkan fleksibilitas untuk mendapatkan kembali struktur pohon yang berisi semua elemen dokumen Anda tanpa memengaruhi jejak memori aplikasi.
JDOM menyediakan berbagai fungsi utilitas yang dapat Anda gunakan untuk memeriksa konten dan struktur dokumen XML jika dokumen tersebut terstruktur dengan baik dan strukturnya diketahui.
Keuntungan
JDOM memberi pengembang Java fleksibilitas dan kemudahan pemeliharaan kode parsing XML. Ini adalah API yang ringan dan cepat.
Kelas JDOM
JDOM mendefinisikan beberapa kelas Java. Berikut adalah kelas yang paling umum -
Document- Mewakili seluruh dokumen XML. Objek Dokumen sering disebut sebagai pohon DOM.
Element- Mewakili elemen XML. Objek elemen memiliki metode untuk memanipulasi elemen anaknya, teksnya, atribut, dan ruang namanya.
Attribute- Merupakan atribut dari suatu elemen. Atribut memiliki metode untuk mendapatkan dan mengatur nilai atribut. Ini memiliki induk dan tipe atribut.
Text - Merupakan teks dari tag XML.
Comment - Mewakili komentar dalam dokumen XML.
Metode JDOM Umum
Saat Anda bekerja dengan JDOM, ada beberapa metode yang akan sering Anda gunakan -
SAXBuilder.build(xmlSource)() - Bangun dokumen JDOM dari sumber xml.
Document.getRootElement() - Dapatkan elemen root dari XML.
Element.getName() - Dapatkan nama node XML.
Element.getChildren() - Dapatkan semua node turunan langsung dari suatu elemen.
Node.getChildren(Name) - Dapatkan semua node turunan langsung dengan nama tertentu.
Node.getChild(Name) - Dapatkan simpul anak pertama dengan nama yang diberikan.
Langkah-langkah untuk Menggunakan JDOM
Berikut adalah langkah-langkah yang digunakan saat mengurai dokumen menggunakan JDOM Parser.
- Impor paket terkait XML.
- Buat SAXBuilder
- Buat Dokumen dari file atau aliran
- Ekstrak elemen root
- Periksa atributnya
- Periksa sub-elemen
Impor paket terkait XML
import java.io.*;
import java.util.*;
import org.jdom2.*;
Buat DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
Buat Dokumen dari file atau aliran
File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);
Ekstrak elemen root
Element classElement = document.getRootElement();
Periksa atributnya
//returns specific attribute
getAttribute("attributeName");
Periksa sub-elemen
//returns a list of subelements of specified name
getChildren("subelementName");
//returns a list of all child nodes
getChildren();
//returns first child node
getChild("subelementName");
Contoh Demo
Berikut adalah file input xml yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
DomParserDemo.java
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class JDomParserDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);
System.out.println("Root element :" + document.getRootElement().getName());
Element classElement = document.getRootElement();
List<Element> studentList = classElement.getChildren();
System.out.println("----------------------------");
for (int temp = 0; temp < studentList.size(); temp++) {
Element student = studentList.get(temp);
System.out.println("\nCurrent Element :"
+ student.getName());
Attribute attribute = student.getAttribute("rollno");
System.out.println("Student roll no : "
+ attribute.getValue() );
System.out.println("First Name : "
+ student.getChild("firstname").getText());
System.out.println("Last Name : "
+ student.getChild("lastname").getText());
System.out.println("Nick Name : "
+ student.getChild("nickname").getText());
System.out.println("Marks : "
+ student.getChild("marks").getText());
}
} catch(JDOMException e) {
e.printStackTrace();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Root element :class
----------------------------
Current Element :student
Student roll no : 393
First Name : dinkar
Last Name : kad
Nick Name : dinkar
Marks : 85
Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95
Current Element :student
Student roll no : 593
First Name : jasvir
Last Name : singn
Nick Name : jazz
Marks : 90
Contoh Demo
Berikut adalah file input xml yang perlu kita kueri -
<?xml version = "1.0"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferarri 101</carname>
<carname type = "sports car">Ferarri 201</carname>
<carname type = "sports car">Ferarri 301</carname>
</supercars>
<supercars company = "Lamborgini">
<carname>Lamborgini 001</carname>
<carname>Lamborgini 002</carname>
<carname>Lamborgini 003</carname>
</supercars>
<luxurycars company = "Benteley">
<carname>Benteley 1</carname>
<carname>Benteley 2</carname>
<carname>Benteley 3</carname>
</luxurycars>
</cars>
QueryXmlFileDemo.java
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class QueryXmlFileDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);
System.out.println("Root element :" + document.getRootElement().getName());
Element classElement = document.getRootElement();
List<Element> supercarList = classElement.getChildren("supercars");
System.out.println("----------------------------");
for (int temp = 0; temp < supercarList.size(); temp++) {
Element supercarElement = supercarList.get(temp);
System.out.println("\nCurrent Element :" + supercarElement.getName());
Attribute attribute = supercarElement.getAttribute("company");
System.out.println("company : " + attribute.getValue() );
List<Element> carNameList = supercarElement.getChildren("carname");
for (int count = 0; count < carNameList.size(); count++) {
Element carElement = carNameList.get(count);
System.out.print("car name : ");
System.out.println(carElement.getText());
System.out.print("car type : ");
Attribute typeAttribute = carElement.getAttribute("type");
if(typeAttribute != null)
System.out.println(typeAttribute.getValue());
else {
System.out.println("");
}
}
}
} catch(JDOMException e) {
e.printStackTrace();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Root element :cars
----------------------------
Current Element :supercars
company : Ferrari
car name : Ferarri 101
car type : formula one
car name : Ferarri 201
car type : sports car
car name : Ferarri 301
car type : sports car
Current Element :supercars
company : Lamborgini
car name : Lamborgini 001
car type :
car name : Lamborgini 002
car type :
car name : Lamborgini 003
car type :
Contoh Demo
Berikut adalah file XML yang perlu kita buat -
<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
CreateXmlFileDemo.java
import java.io.IOException;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class CreateXmlFileDemo {
public static void main(String[] args) {
try{
//root element
Element carsElement = new Element("cars");
Document doc = new Document(carsElement);
//supercars element
Element supercarElement = new Element("supercars");
supercarElement.setAttribute(new Attribute("company","Ferrari"));
//supercars element
Element carElement1 = new Element("carname");
carElement1.setAttribute(new Attribute("type","formula one"));
carElement1.setText("Ferrari 101");
Element carElement2 = new Element("carname");
carElement2.setAttribute(new Attribute("type","sports"));
carElement2.setText("Ferrari 202");
supercarElement.addContent(carElement1);
supercarElement.addContent(carElement2);
doc.getRootElement().addContent(supercarElement);
XMLOutputter xmlOutput = new XMLOutputter();
// display ml
xmlOutput.setFormat(Format.getPrettyFormat());
xmlOutput.output(doc, System.out);
} catch(IOException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
Contoh Demo
Berikut adalah file teks masukan yang perlu kita modifikasi -
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
<luxurycars company = "Benteley">
<carname>Benteley 1</carname>
<carname>Benteley 2</carname>
<carname>Benteley 3</carname>
</luxurycars>
</cars>
ModifyXmlFileDemo.java
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class ModifyXMLFileDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);
Element rootElement = document.getRootElement();
//get first supercar
Element supercarElement = rootElement.getChild("supercars");
// update supercar attribute
Attribute attribute = supercarElement.getAttribute("company");
attribute.setValue("Lamborigini");
// loop the supercar child node
List<Element> list = supercarElement.getChildren();
for (int temp = 0; temp < list.size(); temp++) {
Element carElement = list.get(temp);
if("Ferrari 101".equals(carElement.getText())) {
carElement.setText("Lamborigini 001");
}
if("Ferrari 202".equals(carElement.getText())) {
carElement.setText("Lamborigini 002");
}
}
//get all supercars element
List<Element> supercarslist = rootElement.getChildren();
for (int temp = 0; temp < supercarslist.size(); temp++) {
Element tempElement = supercarslist.get(temp);
if("luxurycars".equals(tempElement.getName())) {
rootElement.removeContent(tempElement);
}
}
XMLOutputter xmlOutput = new XMLOutputter();
// display xml
xmlOutput.setFormat(Format.getPrettyFormat());
xmlOutput.output(document, System.out);
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
<supercars company = "Lamborigini">
<carname type = "formula one">Lamborigini 001</carname>
<carname type = "sports">Lamborigini 002</carname>
</supercars>
</cars>
StAX adalah API berbasis Java untuk mengurai dokumen XML dengan cara yang sama seperti yang dilakukan parser SAX. Tetapi ada dua perbedaan utama antara kedua API -
StAX adalah PULL API, sedangkan SAX adalah PUSH API. Artinya dalam kasus parser StAX, aplikasi klien perlu meminta parser StAX untuk mendapatkan informasi dari XML kapan pun dibutuhkan. Namun dalam kasus pengurai SAX, aplikasi klien diperlukan untuk mendapatkan informasi saat pengurai SAX memberi tahu aplikasi klien bahwa informasi tersedia.
StAX API dapat membaca serta menulis dokumen XML. Menggunakan SAX API, file XML hanya dapat dibaca.
Pengaturan Lingkungan
Untuk menggunakan StAX parser, Anda harus memiliki stax.jar di classpath aplikasi Anda.
Berikut adalah fitur-fitur StAX API -
Membaca dokumen XML dari atas ke bawah, mengenali token yang menyusun dokumen XML dengan format yang baik.
Token diproses dalam urutan yang sama seperti yang muncul di dokumen.
Melaporkan program aplikasi sifat token yang ditemukan oleh parser saat terjadi.
Program aplikasi menyediakan pembaca "peristiwa" yang bertindak sebagai iterator dan mengulangi peristiwa tersebut untuk mendapatkan informasi yang diperlukan. Pembaca lain yang tersedia adalah "kursor" yang bertindak sebagai penunjuk ke node XML.
Saat peristiwa diidentifikasi, elemen XML dapat diambil dari objek peristiwa dan dapat diproses lebih lanjut.
Kapan Menggunakan?
Anda harus menggunakan parser StAX ketika -
Anda dapat memproses dokumen XML secara linier dari atas ke bawah.
Dokumen tidak bertumpuk secara mendalam.
Anda sedang memproses dokumen XML yang sangat besar yang pohon DOMnya akan menghabiskan terlalu banyak memori. Implementasi DOM tipikal menggunakan sepuluh byte memori untuk mewakili satu byte XML.
Masalah yang harus dipecahkan hanya melibatkan sebagian dari dokumen XML.
Data tersedia segera setelah dilihat oleh parser, sehingga StAX berfungsi dengan baik untuk dokumen XML yang masuk melalui aliran.
Kekurangan SAX
Kami tidak memiliki akses acak ke dokumen XML, karena diproses dengan cara hanya meneruskan.
Jika Anda perlu melacak data yang telah dilihat parser atau di mana parser telah mengubah urutan item, maka Anda harus menulis kode dan menyimpan datanya sendiri.
Kelas XMLEventReader
Kelas ini menyediakan iterator kejadian yang dapat digunakan untuk mengulang kejadian saat mereka terjadi saat mengurai dokumen XML.
StartElement asStartElement() - Digunakan untuk mengambil nilai dan atribut elemen.
EndElement asEndElement() - Disebut di akhir elemen.
Characters asCharacters() - Dapat digunakan untuk mendapatkan karakter seperti CDATA, spasi, dll.
Kelas XMLEventWriter
Antarmuka ini menentukan metode untuk membuat acara.
add(Event event) - Tambahkan acara yang berisi elemen ke XML.
Kelas XMLStreamReader
Kelas ini menyediakan iterator kejadian yang dapat digunakan untuk mengulang kejadian saat mereka terjadi saat mengurai dokumen XML.
int next() - Digunakan untuk mengambil acara berikutnya.
boolean hasNext() - Digunakan untuk mengecek event lebih lanjut ada atau tidak.
String getText() - Digunakan untuk mendapatkan teks dari suatu elemen.
String getLocalName() - Digunakan untuk mendapatkan nama elemen.
Kelas XMLStreamWriter
Antarmuka ini menentukan metode untuk membuat acara.
writeStartElement(String localName) - Tambahkan elemen awal dari nama yang diberikan.
writeEndElement(String localName) - Tambahkan elemen akhir dari nama yang diberikan.
writeAttribute(String localName, String value) - Menulis atribut ke suatu elemen.
Contoh Demo
Berikut adalah file input xml yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
StAXParserDemo.java
package com.tutorialspoint.xml;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
public class StAXParserDemo {
public static void main(String[] args) {
boolean bFirstName = false;
boolean bLastName = false;
boolean bNickName = false;
boolean bMarks = false;
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader =
factory.createXMLEventReader(new FileReader("input.txt"));
while(eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
switch(event.getEventType()) {
case XMLStreamConstants.START_ELEMENT:
StartElement startElement = event.asStartElement();
String qName = startElement.getName().getLocalPart();
if (qName.equalsIgnoreCase("student")) {
System.out.println("Start Element : student");
Iterator<Attribute> attributes = startElement.getAttributes();
String rollNo = attributes.next().getValue();
System.out.println("Roll No : " + rollNo);
} else if (qName.equalsIgnoreCase("firstname")) {
bFirstName = true;
} else if (qName.equalsIgnoreCase("lastname")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("nickname")) {
bNickName = true;
}
else if (qName.equalsIgnoreCase("marks")) {
bMarks = true;
}
break;
case XMLStreamConstants.CHARACTERS:
Characters characters = event.asCharacters();
if(bFirstName) {
System.out.println("First Name: " + characters.getData());
bFirstName = false;
}
if(bLastName) {
System.out.println("Last Name: " + characters.getData());
bLastName = false;
}
if(bNickName) {
System.out.println("Nick Name: " + characters.getData());
bNickName = false;
}
if(bMarks) {
System.out.println("Marks: " + characters.getData());
bMarks = false;
}
break;
case XMLStreamConstants.END_ELEMENT:
EndElement endElement = event.asEndElement();
if(endElement.getName().getLocalPart().equalsIgnoreCase("student")) {
System.out.println("End Element : student");
System.out.println();
}
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Start Element : student
Roll No : 393
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element : student
Start Element : student
Roll No : 493
First Name: Vaneet
Last Name: Gupta
Nick Name: vinni
Marks: 95
End Element : student
Start Element : student
Roll No : 593
First Name: jasvir
Last Name: singn
Nick Name: jazz
Marks: 90
End Element : student
Contoh Demo
Berikut adalah file input xml yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
StAXParserDemo.java
package com.tutorialspoint.xml;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
public class StAXQueryDemo {
public static void main(String[] args) {
boolean bFirstName = false;
boolean bLastName = false;
boolean bNickName = false;
boolean bMarks = false;
boolean isRequestRollNo = false;
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader =
factory.createXMLEventReader(new FileReader("input.txt"));
String requestedRollNo = "393";
while(eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
switch(event.getEventType()) {
case XMLStreamConstants.START_ELEMENT:
StartElement startElement = event.asStartElement();
String qName = startElement.getName().getLocalPart();
if (qName.equalsIgnoreCase("student")) {
Iterator<Attribute> attributes = startElement.getAttributes();
String rollNo = attributes.next().getValue();
if(rollNo.equalsIgnoreCase(requestedRollNo)) {
System.out.println("Start Element : student");
System.out.println("Roll No : " + rollNo);
isRequestRollNo = true;
}
} else if (qName.equalsIgnoreCase("firstname")) {
bFirstName = true;
} else if (qName.equalsIgnoreCase("lastname")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("nickname")) {
bNickName = true;
}
else if (qName.equalsIgnoreCase("marks")) {
bMarks = true;
}
break;
case XMLStreamConstants.CHARACTERS:
Characters characters = event.asCharacters();
if(bFirstName && isRequestRollNo) {
System.out.println("First Name: " + characters.getData());
bFirstName = false;
}
if(bLastName && isRequestRollNo) {
System.out.println("Last Name: " + characters.getData());
bLastName = false;
}
if(bNickName && isRequestRollNo) {
System.out.println("Nick Name: " + characters.getData());
bNickName = false;
}
if(bMarks && isRequestRollNo) {
System.out.println("Marks: " + characters.getData());
bMarks = false;
}
break;
case XMLStreamConstants.END_ELEMENT:
EndElement endElement = event.asEndElement();
if(endElement.getName().getLocalPart().equalsIgnoreCase(
"student") && isRequestRollNo) {
System.out.println("End Element : student");
System.out.println();
isRequestRollNo = false;
}
break;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Start Element : student
Roll No : 393
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element : student
Contoh Demo
Berikut adalah XML yang perlu kita buat -
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
StAXCreateXMLDemo.java
package com.tutorialspoint.xml;
import java.io.IOException;
import java.io.StringWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
public class StAXCreateXMLDemo {
public static void main(String[] args) {
try {
StringWriter stringWriter = new StringWriter();
XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter xMLStreamWriter =
xMLOutputFactory.createXMLStreamWriter(stringWriter);
xMLStreamWriter.writeStartDocument();
xMLStreamWriter.writeStartElement("cars");
xMLStreamWriter.writeStartElement("supercars");
xMLStreamWriter.writeAttribute("company", "Ferrari");
xMLStreamWriter.writeStartElement("carname");
xMLStreamWriter.writeAttribute("type", "formula one");
xMLStreamWriter.writeCharacters("Ferrari 101");
xMLStreamWriter.writeEndElement();
xMLStreamWriter.writeStartElement("carname");
xMLStreamWriter.writeAttribute("type", "sports");
xMLStreamWriter.writeCharacters("Ferrari 202");
xMLStreamWriter.writeEndElement();
xMLStreamWriter.writeEndElement();
xMLStreamWriter.writeEndDocument();
xMLStreamWriter.flush();
xMLStreamWriter.close();
String xmlString = stringWriter.getBuffer().toString();
stringWriter.close();
System.out.println(xmlString);
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
Contoh Demo
Berikut adalah XML yang perlu kita modifikasi -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singh</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
StAXModifyDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class StAXModifyDemo {
public static void main(String[] args) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader(
new FileReader("input.txt"));
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(new File("input.txt"));
Element rootElement = document.getRootElement();
List<Element> studentElements = rootElement.getChildren("student");
while(eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
switch(event.getEventType()) {
case XMLStreamConstants.START_ELEMENT:
StartElement startElement = event.asStartElement();
String qName = startElement.getName().getLocalPart();
if (qName.equalsIgnoreCase("student")) {
Iterator<Attribute> attributes = startElement.getAttributes();
String rollNo = attributes.next().getValue();
if(rollNo.equalsIgnoreCase("393")) {
//get the student with roll no 393
for(int i = 0;i < studentElements.size();i++) {
Element studentElement = studentElements.get(i);
if(studentElement.getAttribute(
"rollno").getValue().equalsIgnoreCase("393")) {
studentElement.removeChild("marks");
studentElement.addContent(new Element("marks").setText("80"));
}
}
}
}
break;
}
}
XMLOutputter xmlOutput = new XMLOutputter();
// display xml
xmlOutput.setFormat(Format.getPrettyFormat());
xmlOutput.output(document, System.out);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8"?>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>80</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singh</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
XPath adalah rekomendasi resmi dari World Wide Web Consortium (W3C). Ini mendefinisikan bahasa untuk menemukan informasi dalam file XML. Ini digunakan untuk melintasi elemen dan atribut dokumen XML. XPath menyediakan berbagai jenis ekspresi yang dapat digunakan untuk menanyakan informasi yang relevan dari dokumen XML.
Apa itu XPath?
Structure Definations - XPath mendefinisikan bagian-bagian dari dokumen XML seperti elemen, atribut, teks, namespace, instruksi-pemrosesan, komentar, dan node dokumen.
Path Expressions - XPath menyediakan ekspresi jalur yang kuat seperti node tertentu atau daftar node dalam dokumen XML.
Standard Functions - XPath menyediakan pustaka fungsi standar yang kaya untuk manipulasi nilai string, nilai numerik, perbandingan tanggal dan waktu, manipulasi node dan QName, manipulasi urutan, nilai Boolean, dll.
Major part of XSLT - XPath adalah salah satu elemen utama dalam standar XSLT dan seseorang harus memiliki pengetahuan yang memadai tentang XPath agar dapat bekerja dengan dokumen XSLT.
W3C recommendation - XPath adalah rekomendasi resmi dari World Wide Web Consortium (W3C).
Ekspresi XPath
XPath menggunakan ekspresi jalur untuk memilih node atau daftar node dari dokumen XML. Berikut adalah daftar jalur dan ekspresi yang berguna untuk memilih node / daftar node mana pun dari dokumen XML.
Sr.No. | Ekspresi & Deskripsi |
---|---|
1 | node-name Pilih semua node dengan nama yang diberikan "nodename" |
2 | / Seleksi dimulai dari simpul akar |
3 | // Seleksi dimulai dari simpul saat ini yang cocok dengan pilihan |
4 | . Memilih node saat ini |
5 | .. Memilih induk dari node saat ini |
6 | @ Memilih atribut |
7 | student Example - Memilih semua node dengan nama "siswa" |
8 | class/student Example - Memilih semua elemen siswa yang merupakan anak-anak kelas |
9 | //student Memilih semua elemen siswa di mana pun mereka berada dalam dokumen |
Predikat
Predikat digunakan untuk mencari node tertentu atau node yang mengandung nilai tertentu dan ditentukan dengan menggunakan [...].
Ekspresi | Hasil |
---|---|
/ class / siswa [1] | Memilih elemen siswa pertama yaitu anak dari elemen kelas. |
/ class / student [terakhir ()] | Memilih elemen siswa terakhir yaitu anak dari elemen kelas. |
/ kelas / siswa [terakhir () - 1] | Memilih elemen siswa terakhir tapi satu yang merupakan anak dari elemen kelas. |
// siswa [@rollno = '493'] | Memilih semua elemen siswa yang memiliki atribut bernama rollno dengan nilai '493' |
Langkah-langkah untuk Menggunakan XPath
Berikut adalah langkah-langkah yang digunakan saat mengurai dokumen menggunakan XPath Parser.
Impor paket terkait XML.
Buat DocumentBuilder.
Buat Dokumen dari file atau aliran.
Buat objek Xpath dan ekspresi jalur XPath.
Kompilasi ekspresi XPath menggunakan XPath.compile() dan mendapatkan daftar node dengan mengevaluasi ekspresi yang dikompilasi melalui XPath.evaluate().
Iterasi daftar node.
Periksa atributnya.
Periksa sub-elemen.
Impor paket terkait XML
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import java.io.*;
Buat DocumentBuilder
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Buat Dokumen dari file atau aliran
StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version = "1.0"?> <class> </class>");
ByteArrayInputStream input = new ByteArrayInputStream(
xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);
Bangun XPath
XPath xPath = XPathFactory.newInstance().newXPath();
Siapkan ekspresi Path dan evaluasi itu
String expression = "/class/student";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
doc, XPathConstants.NODESET);
Iterasi melalui NodeList
for (int i = 0; i < nodeList.getLength(); i++) {
Node nNode = nodeList.item(i);
...
}
Periksa atributnya
//returns specific attribute
getAttribute("attributeName");
//returns a Map (table) of names/values
getAttributes();
Periksa sub-elemen
//returns a list of subelements of specified name
getElementsByTagName("subelementName");
//returns a list of all child nodes
getChildNodes();
Contoh Demo
Berikut adalah file teks masukan yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singh</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
XPathParserDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
public class XPathParserDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/class/student";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
doc, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node nNode = nodeList.item(i);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Student roll no :" + eElement.getAttribute("rollno"));
System.out.println("First Name : "
+ eElement
.getElementsByTagName("firstname")
.item(0)
.getTextContent());
System.out.println("Last Name : "
+ eElement
.getElementsByTagName("lastname")
.item(0)
.getTextContent());
System.out.println("Nick Name : "
+ eElement
.getElementsByTagName("nickname")
.item(0)
.getTextContent());
System.out.println("Marks : "
+ eElement
.getElementsByTagName("marks")
.item(0)
.getTextContent());
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Current Element :student
Student roll no : 393
First Name : dinkar
Last Name : kad
Nick Name : dinkar
Marks : 85
Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95
Current Element :student
Student roll no : 593
First Name : jasvir
Last Name : singh
Nick Name : jazz
Marks : 90
Contoh Demo
Berikut adalah file teks masukan yang perlu kita kueri -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
XPathParserDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
public class XPathParserDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/class/student[@rollno = '493']";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
doc, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node nNode = nodeList.item(i);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Student roll no : "
+ eElement.getAttribute("rollno"));
System.out.println("First Name : "
+ eElement
.getElementsByTagName("firstname")
.item(0)
.getTextContent());
System.out.println("Last Name : "
+ eElement
.getElementsByTagName("lastname")
.item(0)
.getTextContent());
System.out.println("Nick Name : "
+ eElement
.getElementsByTagName("nickname")
.item(0)
.getTextContent());
System.out.println("Marks : "
+ eElement
.getElementsByTagName("marks")
.item(0)
.getTextContent());
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
Nick Name : vinni
Marks : 95
XPath parser is used to navigate XML Documents only. It is better to use DOM parser for creating XML. Please refer the Java DOM Parser section for the same.
XPath parser is used to navigate XML Documents only. It is better to use DOM parser for modifying XML. Please refer the Java DOM Parser section for the same.
DOM4J adalah perpustakaan open source berbasis Java untuk mengurai dokumen XML. Ini adalah API yang sangat fleksibel dan hemat memori. Ini dioptimalkan untuk Java dan menggunakan koleksi Java seperti Daftar dan Array.
DOM4J bekerja dengan DOM, SAX, XPath, dan XSLT. Itu dapat mengurai dokumen XML besar dengan jejak memori yang sangat rendah.
Pengaturan Lingkungan
Untuk menggunakan parser DOM4J, Anda harus memiliki dom4j-1.6.1.jar dan jaxen.jar di classpath aplikasi Anda. Unduh dom4j-1.6.1.zip.
Kapan Menggunakan?
Anda harus menggunakan parser DOM4J ketika -
Anda perlu tahu banyak tentang struktur dokumen XML.
Anda perlu memindahkan bagian-bagian dokumen XML (Anda mungkin ingin mengurutkan elemen tertentu, misalnya).
Anda perlu menggunakan informasi dalam dokumen XML lebih dari sekali.
Anda adalah pengembang Java dan ingin memanfaatkan penguraian XML yang dioptimalkan untuk Java.
Apa yang kau dapatkan?
Saat Anda mengurai dokumen XML dengan parser DOM4J, Anda mendapatkan fleksibilitas untuk mendapatkan kembali struktur pohon yang berisi semua elemen dokumen Anda tanpa memengaruhi jejak memori aplikasi.
DOM4J menyediakan berbagai fungsi utilitas yang dapat Anda gunakan untuk memeriksa konten dan struktur dokumen XML jika dokumen tersebut terstruktur dengan baik dan strukturnya diketahui.
DOM4J menggunakan ekspresi XPath untuk menavigasi dokumen XML.
Keuntungan
DOM4J memberi pengembang Java fleksibilitas dan kemudahan pemeliharaan kode parsing XML. Ini adalah API yang ringan dan cepat.
Kelas DOM4J
DOM4J mendefinisikan beberapa kelas Java. Berikut adalah kelas yang paling umum -
Document- Mewakili seluruh dokumen XML. Objek Dokumen sering disebut sebagai pohon DOM.
Element- Mewakili elemen XML. Objek elemen memiliki metode untuk memanipulasi elemen anak, teks, atribut, dan ruang nama.
Attribute- Merupakan atribut dari suatu elemen. Atribut memiliki metode untuk mendapatkan dan mengatur nilai atribut. Ini memiliki induk dan tipe atribut.
Node - Merupakan Elemen, Atribut, atau Instruksi Pemrosesan.
Metode DOM4J umum
Saat Anda bekerja dengan DOM4J, ada beberapa metode yang akan sering Anda gunakan -
SAXReader.read(xmlSource)() - Bangun dokumen DOM4J dari sumber XML.
Document.getRootElement() - Dapatkan elemen root dari dokumen XML.
Element.node(index) - Dapatkan node XML pada indeks tertentu dalam sebuah elemen.
Element.attributes() - Dapatkan semua atribut sebuah elemen.
Node.valueOf(@Name) - Dapatkan nilai atribut dengan nama elemen yang diberikan.
Langkah-langkah untuk Menggunakan DOM4J
Berikut adalah langkah-langkah yang digunakan saat mengurai dokumen menggunakan DOM4J Parser.
Impor paket terkait XML.
Buat SAXReader.
Buat Dokumen dari file atau aliran.
Dapatkan node yang diperlukan menggunakan XPath Expression dengan memanggil document.selectNodes ()
Ekstrak elemen root.
Iterasi daftar node.
Periksa atributnya.
Periksa sub-elemen.
Impor paket terkait XML
import java.io.*;
import java.util.*;
import org.dom4j.*;
Buat DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
Buat Dokumen dari file atau aliran
File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);
Ekstrak elemen root
Element classElement = document.getRootElement();
Periksa atributnya
//returns specific attribute
valueOf("@attributeName");
Periksa sub-elemen
//returns first child node
selectSingleNode("subelementName");
Contoh Demo
Berikut adalah file input xml yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
DOM4JParserDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class DOM4JParserDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXReader reader = new SAXReader();
Document document = reader.read( inputFile );
System.out.println("Root element :" + document.getRootElement().getName());
Element classElement = document.getRootElement();
List<Node> nodes = document.selectNodes("/class/student" );
System.out.println("----------------------------");
for (Node node : nodes) {
System.out.println("\nCurrent Element :"
+ node.getName());
System.out.println("Student roll no : "
+ node.valueOf("@rollno") );
System.out.println("First Name : "
+ node.selectSingleNode("firstname").getText());
System.out.println("Last Name : "
+ node.selectSingleNode("lastname").getText());
System.out.println("First Name : "
+ node.selectSingleNode("nickname").getText());
System.out.println("Marks : "
+ node.selectSingleNode("marks").getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Root element :class
----------------------------
Current Element :student
Student roll no :
First Name : dinkar
Last Name : kad
First Name : dinkar
Marks : 85
Current Element :student
Student roll no :
First Name : Vaneet
Last Name : Gupta
First Name : vinni
Marks : 95
Current Element :student
Student roll no :
First Name : jasvir
Last Name : singn
First Name : jazz
Marks : 90
Contoh Demo
Berikut adalah file input xml yang perlu kita parse -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
DOM4JQueryDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class DOM4JQueryDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXReader reader = new SAXReader();
Document document = reader.read( inputFile );
System.out.println("Root element :" + document.getRootElement().getName());
Element classElement = document.getRootElement();
List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" );
System.out.println("----------------------------");
for (Node node : nodes) {
System.out.println("\nCurrent Element :"
+ node.getName());
System.out.println("Student roll no : "
+ node.valueOf("@rollno") );
System.out.println("First Name : "
+ node.selectSingleNode("firstname").getText());
System.out.println("Last Name : "
+ node.selectSingleNode("lastname").getText());
System.out.println("First Name : "
+ node.selectSingleNode("nickname").getText());
System.out.println("Marks : "
+ node.selectSingleNode("marks").getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
Root element :class
----------------------------
Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
First Name : vinni
Marks : 95
Contoh Demo
Berikut adalah XML yang perlu kita buat -
<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
CreateXmlFileDemo.java
package com.tutorialspoint.xml;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class DOM4JCreateXMLDemo {
public static void main(String[] args) {
try {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "cars" );
Element supercarElement = root.addElement("supercars")
.addAttribute("company", "Ferrai");
supercarElement.addElement("carname")
.addAttribute("type", "Ferrari 101")
.addText("Ferrari 101");
supercarElement.addElement("carname")
.addAttribute("type", "sports")
.addText("Ferrari 202");
// Pretty print the document to System.out
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer;
writer = new XMLWriter( System.out, format );
writer.write( document );
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8"?>
<cars>
<supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars>
</cars>
Contoh Demo
Berikut adalah XML yang perlu kita modifikasi -
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
DOM4jModifyXMLDemo.java
package com.tutorialspoint.xml;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class DOM4jModifyXMLDemo {
public static void main(String[] args) {
try {
File inputFile = new File("input.txt");
SAXReader reader = new SAXReader();
Document document = reader.read( inputFile );
Element classElement = document.getRootElement();
List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" );
for (Node node : nodes) {
Element element = (Element)node;
Iterator<Element> iterator = element.elementIterator("marks");
while(iterator.hasNext()) {
Element marksElement = (Element)iterator.next();
marksElement.setText("80");
}
}
// Pretty print the document to System.out
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer;
writer = new XMLWriter( System.out, format );
writer.write( document );
} catch (DocumentException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ini akan menghasilkan hasil sebagai berikut -
<?xml version = "1.0" encoding = "UTF-8"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>80</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>