Java XML - Hướng dẫn nhanh
XML là gì?
XML là một ngôn ngữ dựa trên văn bản đơn giản được thiết kế để lưu trữ và vận chuyển dữ liệu ở định dạng văn bản thuần túy. Nó là viết tắt của Extensible Markup Language. Sau đây là một số tính năng nổi bật của XML.
XML là một ngôn ngữ đánh dấu.
XML là một ngôn ngữ dựa trên thẻ giống như HTML.
Các thẻ XML không được xác định trước như HTML.
Bạn có thể xác định các thẻ của riêng mình, đó là lý do tại sao nó được gọi là ngôn ngữ có thể mở rộng.
Các thẻ XML được thiết kế để tự mô tả.
XML là Khuyến nghị của W3C để lưu trữ dữ liệu và truyền dữ liệu.
Thí dụ
<?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>
Ưu điểm
Sau đây là những ưu điểm mà XML cung cấp:
Technology agnostic- Là văn bản thuần túy, XML độc lập với công nghệ. Nó có thể được sử dụng bởi bất kỳ công nghệ nào cho mục đích lưu trữ dữ liệu và truyền dữ liệu.
Human readable- XML sử dụng định dạng văn bản đơn giản. Con người có thể đọc và hiểu được.
Extensible - Trong XML, các thẻ tùy chỉnh có thể được tạo và sử dụng rất dễ dàng.
Allow Validation - Sử dụng các cấu trúc XSD, DTD và XML có thể được xác nhận một cách dễ dàng.
Nhược điểm
Sau đây là những nhược điểm của việc sử dụng XML:
Redundant Syntax - Thông thường các tệp XML chứa rất nhiều thuật ngữ lặp lại.
Verbose - Là một ngôn ngữ dài dòng, kích thước tệp XML làm tăng chi phí truyền tải và lưu trữ.
Phân tích cú pháp XML đề cập đến việc duyệt qua một tài liệu XML để truy cập hoặc sửa đổi dữ liệu.
Trình phân tích cú pháp XML là gì?
Trình phân tích cú pháp XML cung cấp một cách để truy cập hoặc sửa đổi dữ liệu trong một tài liệu XML. Java cung cấp nhiều tùy chọn để phân tích cú pháp các tài liệu XML. Sau đây là các loại trình phân tích cú pháp khác nhau thường được sử dụng để phân tích cú pháp tài liệu XML.
Dom Parser - Phân tích cú pháp một tài liệu XML bằng cách tải toàn bộ nội dung của tài liệu và tạo cây phân cấp hoàn chỉnh trong bộ nhớ.
SAX Parser- Phân tích cú pháp một tài liệu XML trên các trình kích hoạt dựa trên sự kiện. Không tải toàn bộ tài liệu vào bộ nhớ.
JDOM Parser - Phân tích cú pháp một tài liệu XML theo cách tương tự như trình phân tích cú pháp DOM nhưng theo cách dễ dàng hơn.
StAX Parser - Phân tích cú pháp một tài liệu XML theo cách tương tự như trình phân tích cú pháp SAX nhưng theo cách hiệu quả hơn.
XPath Parser - Phân tích cú pháp một tài liệu XML dựa trên biểu thức và được sử dụng rộng rãi cùng với XSLT.
DOM4J Parser- Thư viện java để phân tích cú pháp XML, XPath và XSLT bằng Java Collections Framework. Nó cung cấp hỗ trợ cho DOM, SAX và JAXP.
Có sẵn các API JAXB và XSLT để xử lý phân tích cú pháp XML theo hướng đối tượng. Chúng tôi sẽ trình bày chi tiết từng trình phân tích cú pháp trong các chương tiếp theo của hướng dẫn này.
Mô hình Đối tượng Tài liệu (DOM) là một khuyến nghị chính thức của World Wide Web Consortium (W3C). Nó định nghĩa một giao diện cho phép các chương trình truy cập và cập nhật kiểu, cấu trúc và nội dung của tài liệu XML. Các trình phân tích cú pháp XML hỗ trợ DOM triển khai giao diện này.
Khi nào sử dụng?
Bạn nên sử dụng trình phân tích cú pháp DOM khi -
Bạn cần biết nhiều về cấu trúc của một tài liệu.
Bạn cần di chuyển các phần của một tài liệu XML xung quanh (ví dụ: bạn có thể muốn sắp xếp các phần tử nhất định).
Bạn cần sử dụng thông tin trong tài liệu XML nhiều lần.
Bạn nhận được gì?
Khi bạn phân tích cú pháp tài liệu XML bằng trình phân tích cú pháp DOM, bạn sẽ lấy lại cấu trúc cây chứa tất cả các phần tử của tài liệu của bạn. DOM cung cấp nhiều chức năng khác nhau mà bạn có thể sử dụng để kiểm tra nội dung và cấu trúc của tài liệu.
Ưu điểm
DOM là một giao diện chung để thao tác các cấu trúc tài liệu. Một trong những mục tiêu thiết kế của nó là mã Java được viết cho một trình phân tích cú pháp tuân thủ DOM sẽ chạy trên bất kỳ trình phân tích cú pháp tuân thủ DOM nào khác mà không cần phải thực hiện bất kỳ sửa đổi nào.
Giao diện DOM
DOM xác định một số giao diện Java. Dưới đây là các giao diện phổ biến nhất -
Node - Kiểu dữ liệu cơ sở của DOM.
Element - Phần lớn các đối tượng bạn sẽ xử lý là Elements.
Attr - Biểu diễn một thuộc tính của một phần tử.
Text - Nội dung thực tế của một Phần tử hoặc Attr.
Document- Đại diện cho toàn bộ tài liệu XML. Đối tượng Document thường được gọi là cây DOM.
Các phương pháp DOM phổ biến
Khi bạn đang làm việc với DOM, có một số phương pháp bạn sẽ sử dụng thường xuyên -
Document.getDocumentElement() - Trả về phần tử gốc của tài liệu.
Node.getFirstChild() - Trả về con đầu tiên của một Node đã cho.
Node.getLastChild() - Trả về con cuối cùng của một Node đã cho.
Node.getNextSibling() - Các phương thức này trả về người anh em tiếp theo của một Node nhất định.
Node.getPreviousSibling() - Các phương thức này trả về phần tử trước đó của một Node nhất định.
Node.getAttribute(attrName) - Đối với một Node đã cho, nó trả về thuộc tính có tên được yêu cầu.
Các bước sử dụng JDOM
Sau đây là các bước được sử dụng khi phân tích cú pháp tài liệu bằng Trình phân tích cú pháp JDOM.
- Nhập các gói liên quan đến XML.
- Tạo một DocumentBuilder
- Tạo tài liệu từ tệp hoặc luồng
- Trích xuất phần tử gốc
- Kiểm tra các thuộc tính
- Kiểm tra các yếu tố phụ
Nhập các gói liên quan đến XML
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
Tạo một DocumentBuilder
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Tạo tài liệu từ tệp hoặc luồng
StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version="1.0"?>
");
ByteArrayInputStream input = new ByteArrayInputStream(
xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);
Trích xuất phần tử gốc
Element root = document.getDocumentElement();
Kiểm tra các thuộc tính
//returns specific attribute
getAttribute("attributeName");
//returns a Map (table) of names/values
getAttributes();
Kiểm tra các yếu tố phụ
//returns a list of subelements of specified name
getElementsByTagName("subelementName");
//returns a list of all child nodes
getChildNodes();
Ví dụ demo
Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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
Ví dụ demo
Đây là tệp xml đầu vào mà chúng tôi cần truy vấn -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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 :
Ví dụ demo
Đây là XML mà chúng ta cần tạo -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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>
Ví dụ demo
Đây là tệp xml đầu vào mà chúng tôi cần sửa đổi -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
-----------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 cho XML) là một trình phân tích cú pháp dựa trên sự kiện cho các tài liệu XML. Không giống như trình phân tích cú pháp DOM, trình phân tích cú pháp SAX không tạo ra cây phân tích cú pháp. SAX là một giao diện trực tuyến cho XML, có nghĩa là các ứng dụng sử dụng SAX nhận thông báo sự kiện về việc tài liệu XML đang được xử lý một phần tử và thuộc tính, tại một thời điểm theo thứ tự tuần tự bắt đầu từ đầu tài liệu và kết thúc bằng việc đóng Yếu tố ROOT.
Đọc tài liệu XML từ trên xuống dưới, nhận ra các mã thông báo tạo nên một tài liệu XML được định dạng tốt.
Các mã thông báo được xử lý theo thứ tự mà chúng xuất hiện trong tài liệu.
Báo cáo chương trình ứng dụng bản chất của mã thông báo mà trình phân tích cú pháp đã gặp phải khi chúng xảy ra.
Chương trình ứng dụng cung cấp một trình xử lý "sự kiện" phải được đăng ký với trình phân tích cú pháp.
Khi các mã được xác định, các phương thức gọi lại trong trình xử lý được gọi với thông tin liên quan.
Khi nào sử dụng?
Bạn nên sử dụng trình phân tích cú pháp SAX khi -
Bạn có thể xử lý tài liệu XML theo kiểu tuyến tính từ trên xuống dưới.
Tài liệu không được lồng sâu.
Bạn đang xử lý một tài liệu XML rất lớn có cây DOM sẽ chiếm quá nhiều bộ nhớ. Các triển khai DOM điển hình sử dụng mười byte bộ nhớ để biểu diễn một byte XML.
Vấn đề cần giải quyết chỉ liên quan đến một phần của tài liệu XML.
Dữ liệu có sẵn ngay khi nó được trình phân tích cú pháp nhìn thấy, vì vậy SAX hoạt động tốt cho một tài liệu XML đến qua một luồng.
Nhược điểm của SAX
Chúng tôi không có quyền truy cập ngẫu nhiên vào tài liệu XML vì nó được xử lý theo cách chỉ chuyển tiếp.
Nếu bạn cần theo dõi dữ liệu mà trình phân tích cú pháp đã nhìn thấy hoặc thay đổi thứ tự của các mục, bạn phải viết mã và lưu trữ dữ liệu của riêng bạn.
Giao diện ContentHandler
Giao diện này chỉ định các phương thức gọi lại mà trình phân tích cú pháp SAX sử dụng để thông báo cho chương trình ứng dụng về các thành phần của tài liệu XML mà nó đã thấy.
void startDocument() - Được gọi ở đầu tài liệu.
void endDocument() - Được gọi ở cuối tài liệu.
void startElement(String uri, String localName, String qName, Attributes atts) - Được gọi ở đầu một phần tử.
void endElement(String uri, String localName,String qName) - Được gọi ở cuối một phần tử.
void characters(char[] ch, int start, int length) - Được gọi khi gặp dữ liệu ký tự.
void ignorableWhitespace( char[] ch, int start, int length) - Được gọi khi có DTD và gặp phải khoảng trắng có thể bỏ qua.
void processingInstruction(String target, String data) - Được gọi khi một lệnh xử lý được nhận dạng.
void setDocumentLocator(Locator locator)) - Cung cấp Bộ định vị có thể được sử dụng để xác định các vị trí trong tài liệu.
void skippedEntity(String name) - Được gọi khi gặp một thực thể chưa được giải quyết.
void startPrefixMapping(String prefix, String uri) - Được gọi khi ánh xạ không gian tên mới được xác định.
void endPrefixMapping(String prefix) - Được gọi khi một định nghĩa không gian tên kết thúc phạm vi của nó.
Giao diện thuộc tính
Giao diện này chỉ định các phương pháp để xử lý các thuộc tính được kết nối với một phần tử.
int getLength() - Trả về số lượng thuộc tính.
String getQName(int index)
String getValue(int index)
String getValue(String qname)
Ví dụ demo
Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -
<?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;
}
}
}
Điều này sẽ tạo ra kết quả sau:
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
Ví dụ demo
Đây là tệp văn bản đầu vào mà chúng ta cần Truy vấn cho 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;
}
}
}
Điều này sẽ tạo ra kết quả sau:
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.
Ví dụ demo
Đây là tệp XML đầu vào mà chúng tôi cần sửa đổi bằng cách thêm <Result> Pass <Result /> vào cuối thẻ </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");
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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 là một thư viện mã nguồn mở, dựa trên Java để phân tích cú pháp các tài liệu XML. Nó thường là một API thân thiện với nhà phát triển Java. Nó được tối ưu hóa Java và nó sử dụng các bộ sưu tập Java như Danh sách và Mảng.
JDOM hoạt động với API DOM và SAX và kết hợp những gì tốt nhất của cả hai. Nó có dung lượng bộ nhớ thấp và nhanh bằng SAX.
Thiết lập môi trường
Để sử dụng trình phân tích cú pháp JDOM, bạn nên có jdom.jar trong classpath của ứng dụng. Tải xuống jdom-2.0.5.zip.
Khi nào sử dụng?
Bạn nên sử dụng trình phân tích cú pháp JDOM khi -
Bạn cần biết nhiều về cấu trúc của một tài liệu XML.
Bạn cần di chuyển các phần của tài liệu XMl xung quanh (ví dụ: bạn có thể muốn sắp xếp các phần tử nhất định).
Bạn cần sử dụng thông tin trong tài liệu XML nhiều lần.
Bạn là nhà phát triển Java và muốn tận dụng khả năng phân tích cú pháp XML được tối ưu hóa của Java.
Bạn nhận được gì?
Khi bạn phân tích cú pháp tài liệu XML bằng trình phân tích cú pháp JDOM, bạn sẽ có được sự linh hoạt để lấy lại cấu trúc cây chứa tất cả các phần tử của tài liệu mà không ảnh hưởng đến vùng nhớ của ứng dụng.
JDOM cung cấp nhiều chức năng tiện ích khác nhau mà bạn có thể sử dụng để kiểm tra nội dung và cấu trúc của tài liệu XML trong trường hợp tài liệu có cấu trúc tốt và cấu trúc của nó được biết đến.
Ưu điểm
JDOM cung cấp cho các nhà phát triển Java tính linh hoạt và dễ bảo trì của mã phân tích cú pháp XML. Nó là một API nhẹ và nhanh chóng.
Các lớp JDOM
JDOM định nghĩa một số lớp Java. Dưới đây là các lớp phổ biến nhất -
Document- Đại diện cho toàn bộ tài liệu XML. Đối tượng Document thường được gọi là cây DOM.
Element- Đại diện cho một phần tử XML. Đối tượng phần tử có các phương thức để thao tác với các phần tử con, văn bản, thuộc tính và không gian tên của nó.
Attribute- Biểu diễn một thuộc tính của một phần tử. Thuộc tính có phương thức để lấy và đặt giá trị của thuộc tính. Nó có kiểu cha mẹ và thuộc tính.
Text - Đại diện cho văn bản của thẻ XML.
Comment - Trình bày các nhận xét trong một tài liệu XML.
Các phương pháp JDOM phổ biến
Khi bạn đang làm việc với JDOM, có một số phương pháp bạn sẽ sử dụng thường xuyên -
SAXBuilder.build(xmlSource)() - Xây dựng tài liệu JDOM từ nguồn xml.
Document.getRootElement() - Lấy phần tử gốc của XML.
Element.getName() - Lấy tên của nút XML.
Element.getChildren() - Lấy tất cả các nút con trực tiếp của một phần tử.
Node.getChildren(Name) - Lấy tất cả các nút con trực tiếp với một tên đã cho.
Node.getChild(Name) - Lấy nút con đầu tiên với tên đã cho.
Các bước sử dụng JDOM
Sau đây là các bước được sử dụng khi phân tích cú pháp tài liệu bằng Trình phân tích cú pháp JDOM.
- Nhập các gói liên quan đến XML.
- Tạo SAXBuilder
- Tạo tài liệu từ tệp hoặc luồng
- Trích xuất phần tử gốc
- Kiểm tra các thuộc tính
- Kiểm tra các yếu tố phụ
Nhập các gói liên quan đến XML
import java.io.*;
import java.util.*;
import org.jdom2.*;
Tạo một DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
Tạo tài liệu từ tệp hoặc luồng
File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);
Trích xuất phần tử gốc
Element classElement = document.getRootElement();
Kiểm tra các thuộc tính
//returns specific attribute
getAttribute("attributeName");
Kiểm tra các yếu tố phụ
//returns a list of subelements of specified name
getChildren("subelementName");
//returns a list of all child nodes
getChildren();
//returns first child node
getChild("subelementName");
Ví dụ demo
Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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
Ví dụ demo
Đây là tệp xml đầu vào mà chúng tôi cần truy vấn -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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 :
Ví dụ demo
Đây là tệp XML mà chúng ta cần tạo -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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>
Ví dụ demo
Đây là tệp văn bản đầu vào mà chúng tôi cần sửa đổi -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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 là một API dựa trên Java để phân tích cú pháp tài liệu XML theo cách tương tự như trình phân tích cú pháp SAX. Nhưng có hai điểm khác biệt chính giữa hai API -
StAX là một API PULL, trong khi SAX là một API PUSH. Nó có nghĩa là trong trường hợp phân tích cú pháp StAX, một ứng dụng khách cần yêu cầu trình phân tích cú pháp StAX lấy thông tin từ XML bất cứ khi nào nó cần. Nhưng trong trường hợp phân tích cú pháp SAX, một ứng dụng khách được yêu cầu để lấy thông tin khi trình phân tích cú pháp SAX thông báo cho ứng dụng khách rằng thông tin có sẵn.
API StAX có thể đọc cũng như viết các tài liệu XML. Sử dụng SAX API, chỉ có thể đọc tệp XML.
Thiết lập môi trường
Để sử dụng trình phân tích cú pháp StAX, bạn nên có stax.jar trong classpath của ứng dụng.
Sau đây là các tính năng của API StAX:
Đọc tài liệu XML từ trên xuống dưới, nhận ra các mã thông báo tạo nên một tài liệu XML được định dạng tốt.
Các mã thông báo được xử lý theo thứ tự mà chúng xuất hiện trong tài liệu.
Báo cáo chương trình ứng dụng bản chất của mã thông báo mà trình phân tích cú pháp đã gặp phải khi chúng xảy ra.
Chương trình ứng dụng cung cấp một trình đọc "sự kiện" hoạt động như một trình lặp và lặp lại sự kiện để lấy thông tin cần thiết. Một trình đọc khác có sẵn là "con trỏ" hoạt động như một con trỏ đến các nút XML.
Khi các sự kiện được xác định, các phần tử XML có thể được truy xuất từ đối tượng sự kiện và có thể được xử lý thêm.
Khi nào sử dụng?
Bạn nên sử dụng trình phân tích cú pháp StAX khi -
Bạn có thể xử lý tài liệu XML theo kiểu tuyến tính từ trên xuống dưới.
Tài liệu không được lồng sâu.
Bạn đang xử lý một tài liệu XML rất lớn có cây DOM sẽ chiếm quá nhiều bộ nhớ. Các triển khai DOM điển hình sử dụng mười byte bộ nhớ để biểu diễn một byte XML.
Vấn đề cần giải quyết chỉ liên quan đến một phần của tài liệu XML.
Dữ liệu có sẵn ngay sau khi nó được trình phân tích cú pháp nhìn thấy, vì vậy StAX hoạt động tốt cho một tài liệu XML được gửi qua một luồng.
Nhược điểm của SAX
Chúng tôi không có quyền truy cập ngẫu nhiên vào một tài liệu XML, vì nó được xử lý theo cách chỉ chuyển tiếp.
Nếu bạn cần theo dõi dữ liệu mà trình phân tích cú pháp đã xem hoặc nơi trình phân tích cú pháp đã thay đổi thứ tự của các mục, thì bạn phải viết mã và lưu trữ dữ liệu của riêng bạn.
Lớp XMLEventReader
Lớp này cung cấp trình lặp các sự kiện có thể được sử dụng để lặp lại các sự kiện khi chúng xảy ra trong khi phân tích cú pháp một tài liệu XML.
StartElement asStartElement() - Dùng để lấy giá trị và thuộc tính của một phần tử.
EndElement asEndElement() - Được gọi ở cuối một phần tử.
Characters asCharacters() - Có thể được sử dụng để lấy các ký tự như CDATA, khoảng trắng, v.v.
Lớp XMLEventWriter
Giao diện này chỉ định các phương pháp để tạo một sự kiện.
add(Event event) - Thêm sự kiện chứa các phần tử vào XML.
Lớp XMLStreamReader
Lớp này cung cấp trình lặp các sự kiện có thể được sử dụng để lặp lại các sự kiện khi chúng xảy ra trong khi phân tích cú pháp một tài liệu XML.
int next() - Dùng để truy xuất sự kiện tiếp theo.
boolean hasNext() - Dùng để kiểm tra các sự kiện tiếp theo có tồn tại hay không.
String getText() - Dùng để lấy văn bản của một phần tử.
String getLocalName() - Dùng để lấy tên của một phần tử.
Lớp XMLStreamWriter
Giao diện này chỉ định các phương pháp để tạo một sự kiện.
writeStartElement(String localName) - Thêm một phần tử bắt đầu của tên đã cho.
writeEndElement(String localName) - Thêm một phần tử cuối của tên đã cho.
writeAttribute(String localName, String value) - Ghi các thuộc tính cho một phần tử.
Ví dụ demo
Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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
Ví dụ demo
Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
Start Element : student
Roll No : 393
First Name: dinkar
Last Name: kad
Nick Name: dinkar
Marks: 85
End Element : student
Ví dụ demo
Đây là XML mà chúng ta cần tạo -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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>
Ví dụ demo
Đây là XML mà chúng tôi cần sửa đổi -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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 là một khuyến nghị chính thức của World Wide Web Consortium (W3C). Nó định nghĩa một ngôn ngữ để tìm thông tin trong một tệp XML. Nó được sử dụng để duyệt qua các phần tử và thuộc tính của một tài liệu XML. XPath cung cấp nhiều loại biểu thức khác nhau có thể được sử dụng để hỏi thông tin liên quan từ tài liệu XML.
XPath là gì?
Structure Definations - XPath định nghĩa các phần của tài liệu XML như phần tử, thuộc tính, văn bản, không gian tên, lệnh xử lý, chú thích và các nút tài liệu.
Path Expressions - XPath cung cấp các biểu thức đường dẫn mạnh mẽ như các nút chọn hoặc danh sách các nút trong tài liệu XML.
Standard Functions - XPath cung cấp một thư viện phong phú các hàm tiêu chuẩn để thao tác các giá trị chuỗi, giá trị số, so sánh ngày và giờ, thao tác nút và QName, thao tác chuỗi, giá trị Boolean, v.v.
Major part of XSLT - XPath là một trong những yếu tố chính trong chuẩn XSLT và người ta phải có đủ kiến thức về XPath để làm việc với các tài liệu XSLT.
W3C recommendation - XPath là khuyến nghị chính thức của World Wide Web Consortium (W3C).
Biểu thức XPath
XPath sử dụng biểu thức đường dẫn để chọn nút hoặc danh sách các nút từ tài liệu XML. Sau đây là danh sách các đường dẫn và biểu thức hữu ích để chọn bất kỳ nút / danh sách các nút nào từ tài liệu XML.
Sr.No. | Biểu thức & Mô tả |
---|---|
1 | node-name Chọn tất cả các nút có tên đã cho "nodename" |
2 | / Lựa chọn bắt đầu từ nút gốc |
3 | // Lựa chọn bắt đầu từ nút hiện tại phù hợp với lựa chọn |
4 | . Chọn nút hiện tại |
5 | .. Chọn nút cha của nút hiện tại |
6 | @ Chọn thuộc tính |
7 | student Example - Chọn tất cả các nút có tên "sinh viên" |
số 8 | class/student Example - Chọn tất cả các phần tử học sinh là con của lớp |
9 | //student Chọn tất cả các phần tử của sinh viên bất kể chúng ở đâu trong tài liệu |
Dự đoán
Dự đoán được sử dụng để tìm nút cụ thể hoặc một nút có chứa giá trị cụ thể và được xác định bằng cách sử dụng [...].
Biểu hiện | Kết quả |
---|---|
/ class / student [1] | Chọn phần tử sinh viên đầu tiên là phần tử con của phần tử lớp. |
/ class / student [last ()] | Chọn phần tử sinh viên cuối cùng là con của phần tử lớp. |
/ class / student [last () - 1] | Chọn phần tử cuối cùng trừ một phần tử sinh viên là phần tử con của phần tử lớp. |
// sinh viên [@rollno = '493'] | Chọn tất cả các phần tử sinh viên có thuộc tính tên là rollno với giá trị là '493' |
Các bước sử dụng XPath
Sau đây là các bước được sử dụng khi phân tích một tài liệu bằng XPath Parser.
Nhập các gói liên quan đến XML.
Tạo một DocumentBuilder.
Tạo Tài liệu từ một tệp hoặc luồng.
Tạo một đối tượng Xpath và một biểu thức đường dẫn XPath.
Biên dịch biểu thức XPath bằng XPath.compile() và nhận danh sách các nút bằng cách đánh giá biểu thức đã biên dịch qua XPath.evaluate().
Lặp lại danh sách các nút.
Kiểm tra các thuộc tính.
Kiểm tra các yếu tố phụ.
Nhập các gói liên quan đến XML
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import java.io.*;
Tạo một DocumentBuilder
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Tạo tài liệu từ tệp hoặc luồng
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);
Xây dựng XPath
XPath xPath = XPathFactory.newInstance().newXPath();
Chuẩn bị biểu thức Đường dẫn và đánh giá nó
String expression = "/class/student";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
doc, XPathConstants.NODESET);
Lặp lại qua NodeList
for (int i = 0; i < nodeList.getLength(); i++) {
Node nNode = nodeList.item(i);
...
}
Kiểm tra các thuộc tính
//returns specific attribute
getAttribute("attributeName");
//returns a Map (table) of names/values
getAttributes();
Kiểm tra các yếu tố phụ
//returns a list of subelements of specified name
getElementsByTagName("subelementName");
//returns a list of all child nodes
getChildNodes();
Ví dụ demo
Đây là tệp văn bản đầu vào mà chúng ta cần phân tích cú pháp -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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
Ví dụ demo
Đây là tệp văn bản đầu vào mà chúng ta cần truy vấn -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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 là một thư viện mã nguồn mở, dựa trên Java để phân tích cú pháp các tài liệu XML. Nó là một API rất linh hoạt và tiết kiệm bộ nhớ. Nó được tối ưu hóa bằng Java và sử dụng các bộ sưu tập Java như Danh sách và Mảng.
DOM4J hoạt động với DOM, SAX, XPath và XSLT. Nó có thể phân tích cú pháp các tài liệu XML lớn với dung lượng bộ nhớ rất thấp.
Thiết lập môi trường
Để sử dụng trình phân tích cú pháp DOM4J, bạn phải có dom4j-1.6.1.jar và jaxen.jar trong classpath của ứng dụng. Tải xuống dom4j-1.6.1.zip.
Khi nào sử dụng?
Bạn nên sử dụng trình phân tích cú pháp DOM4J khi -
Bạn cần biết nhiều về cấu trúc của một tài liệu XML.
Bạn cần di chuyển các phần của một tài liệu XML xung quanh (ví dụ: bạn có thể muốn sắp xếp các phần tử nhất định).
Bạn cần sử dụng thông tin trong tài liệu XML nhiều lần.
Bạn là nhà phát triển Java và muốn tận dụng khả năng phân tích cú pháp XML được Java tối ưu hóa.
Bạn nhận được gì?
Khi bạn phân tích cú pháp tài liệu XML bằng trình phân tích cú pháp DOM4J, bạn sẽ có được sự linh hoạt để lấy lại cấu trúc cây chứa tất cả các phần tử của tài liệu mà không ảnh hưởng đến vùng nhớ của ứng dụng.
DOM4J cung cấp nhiều chức năng tiện ích khác nhau mà bạn có thể sử dụng để kiểm tra nội dung và cấu trúc của tài liệu XML trong trường hợp tài liệu có cấu trúc tốt và cấu trúc của nó được biết đến.
DOM4J sử dụng biểu thức XPath để điều hướng qua tài liệu XML.
Ưu điểm
DOM4J cung cấp cho các nhà phát triển Java tính linh hoạt và dễ bảo trì của mã phân tích cú pháp XML. Nó là một API nhẹ và nhanh chóng.
Các lớp DOM4J
DOM4J định nghĩa một số lớp Java. Dưới đây là các lớp phổ biến nhất -
Document- Đại diện cho toàn bộ tài liệu XML. Đối tượng Document thường được gọi là cây DOM.
Element- Đại diện cho một phần tử XML. Đối tượng phần tử có các phương thức để thao tác các phần tử con, văn bản, thuộc tính và không gian tên của nó.
Attribute- Biểu diễn một thuộc tính của một phần tử. Thuộc tính có phương thức để lấy và đặt giá trị của thuộc tính. Nó có kiểu cha mẹ và thuộc tính.
Node - Đại diện cho Phần tử, Thuộc tính, hoặc Lệnh xử lý.
Các phương thức DOM4J phổ biến
Khi bạn đang làm việc với DOM4J, có một số phương pháp bạn sẽ sử dụng thường xuyên -
SAXReader.read(xmlSource)() - Xây dựng tài liệu DOM4J từ một nguồn XML.
Document.getRootElement() - Lấy phần tử gốc của một tài liệu XML.
Element.node(index) - Lấy nút XML tại một chỉ mục cụ thể trong một phần tử.
Element.attributes() - Nhận tất cả các thuộc tính của một phần tử.
Node.valueOf(@Name) - Nhận các giá trị của một thuộc tính với tên cho sẵn của một phần tử.
Các bước sử dụng DOM4J
Sau đây là các bước được sử dụng khi phân tích cú pháp tài liệu bằng Trình phân tích cú pháp DOM4J.
Nhập các gói liên quan đến XML.
Tạo SAXReader.
Tạo Tài liệu từ một tệp hoặc luồng.
Nhận các nút cần thiết bằng cách sử dụng Biểu thức XPath bằng cách gọi document.selectNodes ()
Giải nén phần tử gốc.
Lặp lại danh sách các nút.
Kiểm tra các thuộc tính.
Kiểm tra các yếu tố phụ.
Nhập các gói liên quan đến XML
import java.io.*;
import java.util.*;
import org.dom4j.*;
Tạo một DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
Tạo tài liệu từ tệp hoặc luồng
File inputFile = new File("input.txt");
SAXBuilder saxBuilder = new SAXBuilder();
Document document = saxBuilder.build(inputFile);
Trích xuất phần tử gốc
Element classElement = document.getRootElement();
Kiểm tra các thuộc tính
//returns specific attribute
valueOf("@attributeName");
Kiểm tra các yếu tố phụ
//returns first child node
selectSingleNode("subelementName");
Ví dụ demo
Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
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
Ví dụ demo
Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
Root element :class
----------------------------
Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
First Name : vinni
Marks : 95
Ví dụ demo
Đây là XML mà chúng ta cần tạo -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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>
Ví dụ demo
Đây là XML mà chúng tôi cần sửa đổi -
<?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();
}
}
}
Điều này sẽ tạo ra kết quả sau:
<?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>