Parse file XML sử dụng XPath trong Java
Bài đăng này đã không được cập nhật trong 6 năm
XPath là ngôn ngữ để tìm kiếm thông tin trong một file XML. Bạn có thể nói rằng: XPath là một loại truy vấn tương tự SQL cho file XML. XPath thường đưuọc sử dụng để điều hướng qua các phần tử và các thuộc tính trong một tài liệu XML. Bạn cũng có thể sử dụng XPath để đọc file XML trong java.
Sử dụng các biểu thức cùng với XPath để phân tích cú pháp một file XML và lấy thông tin cần thiết một cách vô cùng dễ dàng.
Ví dụ với một file XML chứa thông tin của nhân viên được lưu trong file emplyees.xml
như sau:
<?xml version="1.0"?>
<Employees>
<Employee emplid="1111" type="admin">
<firstname>John</firstname>
<lastname>Watson</lastname>
<age>30</age>
<email>johnwatson@sh.com</email>
</Employee>
<Employee emplid="2222" type="admin">
<firstname>Sherlock</firstname>
<lastname>Homes</lastname>
<age>32</age>
<email>sherlock@sh.com</email>
</Employee>
<Employee emplid="3333" type="user">
<firstname>Jim</firstname>
<lastname>Moriarty</lastname>
<age>52</age>
<email>jim@sh.com</email>
</Employee>
<Employee emplid="4444" type="user">
<firstname>Mycroft</firstname>
<lastname>Holmes</lastname>
<age>41</age>
<email>mycroft@sh.com</email>
</Employee>
</Employees>
Chúng ta sẽ sử dụng file XML này và cố gắng lấy một vài thông tin bằng cách sử dụng XPath. Trước khi bắt đầu, chúng ta kiểm tra vài thông tin từ file xml trên:
- Có 4 nhân viên trong file XML
- Mỗi nhân viên có 1 mã duy nhất được định nghĩa bởi trường
emplid
- Mỗi nhân viên cũng có thuộc tính
type
xác định loại nhân viên là: admin hay user - Mỗi nhân viên có 4 node con:
firstname
,lastname
,age
vàemail
- Tuổi là số.
Cùng bắt đầu lấy thông tin nào!
1. Java DOM Parsing API
Để hiểu về XPath, chúng ta cần có hiểu biết cơ bản về cách phân tích DOM trong Java. Java cung cấp cách implement của domparrser dưới dạng API.
1.1. Tạo Java DOM XML Parser
Đầu tiên, chúng ta cần tạo một document builder sử dụng class DocumentBuilderFactory
.
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//...
DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = builderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
1.2. Phân tích XML bằng Java DOM Parser
Khi chúng ta đã có một đối tượng document builder sau bước 1, chúng ta sẽ sử dụng nó để phân tích file XML và tạo một đối tượng document
import org.w3c.dom.Document;
import java.io.IOException;
import org.xml.sax.SAXException;
//...
try {
Document document = builder.parse(
new FileInputStream("c:\\employees.xml"));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Trong code trên, chúng ta đọc 1 file XML trong máy để phân tích. Nếu bạn muốn nhận được giá trị sau khi phân tích XML là String thì bạn có thể thử code sau:
String xml = ...;
Document xmlDocument = builder.parse(new ByteArrayInputStream(xml.getBytes()));
1.3. Tạo một đối tượng XPath
Sau bước 2, bạn đã có một đối tượng document, có nghĩa là bạn đã sẵn sàng để sử dụng XPath cho việc phân tích rồi đó. Trong bước 3 này, chúng ta sẽ tạo một đối tượng XPath để sử dụng XPathFactory
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
//...
XPath xPath = XPathFactory.newInstance().newXPath();
1.4. Sử dụng XPath để phân tích file XML
Sử dụng đối tượng XPath để complie toán tử XPath và trả về kết quả trong document. Chúng ta sẽ thử đọc email của nhân viên có employee_id = 3333. Chúng ta cũng có những API đặc biệt để đọc node XML và danh sách các node.
String expression = "/Employees/Employee[@emplid='3333']/email";
//read a string value
String email = xPath.compile(expression).evaluate(xmlDocument);
//read an xml node using xpath
Node node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
//read a nodelist using xpath
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
2. XPath Expressions
XPtah sử dụng các toán tử để select node hoặc liệt kê các node từ xml document. Tham khảo một số path và toán tử có thể sử dụng để slect bất kì node hay danh sách các node từ một XML document.
Toán tử | Mô tả |
---|---|
nodename |
Chọn tất cả các node với name là "nodename" |
/ |
Chọn từ node root |
// |
Chọn các node trong toàn bộ document tính từ node hiện tại phù hợp với điều kiện |
. |
Chọn node hiện tại |
.. |
CHọn node cha của node hiện tại |
@ |
Chọn attributes |
Ví dụ:
| Toán tử | Kết quả |
| employee
| Chọn tất cả các node với name là "employee" |
| employees/employee
| Chọn tất cả phần tử employee là con cửa employees |
| //employee
| Chọn tất cả phẩn tử employee trong document |
| /employees/employee[1]
| Chọn phần tử employee đầu tiên là con của phần tử employees |
| //employee[@type='admin']
| Chọn tất cả phẩn tử employee có giá trị của attribute là type
là admin |
Tham khảo thêm syntax của XPath ở đây: http://www.w3schools.com/xpath/xpath_syntax.asp
3. Example
3.1. Lấy tên của tất cả các user
String expression = "/Employees/Employee/firstname";
System.out.println(expression);
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
System.out.println(nodeList.item(i).getFirstChild().getNodeValue());
}
Output:
John
Sherlock
Jim
Mycroft
3.2. Lấy nhân viên có employee_id là 3333
String expression = "/Employees/Employee[@emplid='2222']";
System.out.println(expression);
Node node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
if(null != node) {
nodeList = node.getChildNodes();
for (int i = 0;null!=nodeList && i < nodeList.getLength(); i++) {
Node nod = nodeList.item(i);
if(nod.getNodeType() == Node.ELEMENT_NODE)
System.out.println(nodeList.item(i).getNodeName() + " : " + nod.getFirstChild().getNodeValue());
}
}
Output
firstname : Sherlock
lastname : Homes
age : 32
email : sherlock@sh.com
3.3. Đọc tên của tất cả nhân viên lớn hơn 40 tuổi
String expression = "/Employees/Employee[age>40]/firstname";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
System.out.println(nodeList.item(i).getFirstChild().getNodeValue());
}
Output
Jim
Mycroft
Nguồn: Java XML Tutorial
All rights reserved