Để parse một file XML, ta chỉ cần dùng gói thư viện JAXP. Java API for XML Processing(JAXP) là một công cụ cho phép làm việc với dữ liệu dạng XML trên ngôn ngữ Java. JAXP có chứa các hàm API dùng để parse các mô hình DOM hay SAX. Ngoài ra, JAXP còn hỗ trợ chuẩn Extensible Stylesheet Language Transformations(XSLT), cho phép người lập trình có thể chuyển dữ liệu sang một dạng tài liệu XML khác như HTML chẳng hạn.
JAXP gồm có các API như sau:
Chương 7. Chức năng nâng cao của Workflow Editor
• org.w3c.dom: định nghĩa các thành phần trong mô hình DOM. • org.xml.sax: cung cấp các API dùng cho mô hình SAX.
• javax.xml.transform: cung cấp các API XSLT cho phép chuyển sang các dạng XML khác.
• javax.xml.stream: cung cấp các API thực hiện việc chuyển đổi. Ở đây, nhóm sẽ dùng các API theo mô hình DOM cho việc parse file XML.
Hình 7.8: Sơ đồ quá trình parse một tài liệu XML sang cấu trúc DOM
Sử dụng class javax.xml.parsers.DocumentBuilderFactory kết hợp với dữ liệu XML đầu vào để lấy về một instance DocumentBuilder, và sử dụng instance này để sinh ra đối tượng Document phù hợp với mô hình DOM. Đối tượng Document sẽ có cấu trúc hình cây. Chúng ta sẽ trình bày sơ lược một vài lớp tiêu biểu:
Class Document: tạo ra một instance cho tài liệu XML.
Node getDocumentElement(): lấy về các phần tử trong tài liệu XML.
Class Node: tạo ra một instance cho phần tử(element) trong tài liệu XML. String getNodeName(): lấy về tên của phần tử.
NamedNodeMap getAttributes(): lấy về các thuộc tính trong một element đang gọi nó, có trị trả về là một interface NamedNodeMap được xem như là một tập các thuộc tính.
Chương 7. Chức năng nâng cao của Workflow Editor
NodeList getChildNodes(): lấy về node con của node hiện tại, có trị trả về là một interface NodeList.
Sau đây là đoạn code đơn giản mô tả quá trình parse file XML(đoạn code này là hàm gọi đệ quy):
public void parseXML(Node node) { //lấy về tên của phần tử hiện tại String nodeName = node.getNodeName();
//lấy về danh sách các thuộc tính của phần tử hiện tại NamedNodeMap attributes = node.getAttributes();
//xử lý cho từng element khác nhau {
for (int i = 0; i < attributes.getLength(); i++) { Node attribute = attributes.item(i);
/*xử lý từng thuộc tính và giá trị của nó trong từng loại element*/
} }
//lấy về element con của element hiện tại NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) { //gọi đệ quy
parseXML(child); }
}
Ý tưởng cho việc parse XML theo kiểu đệ quy là công việc parse sẽ thực hiện tuần tự từ đầu cho từng element, nếu bắt gặp element có các element con, chương trình sẽ parse tuần tự các element con đó. Nếu hết element con, chương trình sẽ tự động chuyển sang parse element tiếp theo... Cứ như thế các element sẽ được parse hết.
Chương 7. Chức năng nâng cao của Workflow Editor