12/08/2018, 17:03

Parse file XML sử dụng XPath trong Java

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ử ...

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.xmlnhư 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:

  1. Có 4 nhân viên trong file XML
  2. Mỗi nhân viên có 1 mã duy nhất được định nghĩa bởi trường emplid
  3. 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
  4. Mỗi nhân viên có 4 node con: firstname, lastname, age và email
  5. Tuổi là số.

Cùng bắt đầu lấy thông tin nào!

Để 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);

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.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

0