XML là một định dạng file phổ biến hiện nay, do vậy các Java developer chắc hẳn có lúc cần phải xử lý các file XML để rút trích dữ liệu, hay tạo ra các tài liệu XML theo định dạng được yêu cầu. Trong bài viết này chúng ta sẽ cùng tìm hiểu cách đọc file XML trong Java sử dụng DOM XML parser.
1. Đọc file XML
Mặc định Java đã hỗ trợ đọc file XML thông qua DOM XML parser. DOM XML parser sẽ phân tích dữ liệu trong file XML và tải toàn bộ chúng vào bộ nhớ. Sau đó mô hình hóa nó theo cấu trúc “TREE” để để dàng duyệt các phần tử trong đó.
Vì DOM XML parser tải lên toàn bộ nội dung của XML để xử lý do đó chúng ta nên cân nhắc khi xử lý một file XML có dung lượng lớn.
Giả sử có file input.xml sau cần đọc
<?xml version = "1.0"?>
<class>
<student rollno = "400">
<firstname>Nguyen</firstname>
<lastname>Hai</lastname>
<nickname>deft</nickname>
<marks>12</marks>
</student>
<student rollno = "103">
<firstname>Nguyen</firstname>
<lastname>Tu</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Le</firstname>
<lastname>dung</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
Sử dụng DOM XML theo đoạn code mẫu sau:
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 ReadXML {
public static void main(String[] args) {
String dir = System.getProperty("user.dir");
try {
File inputFile = new File(dir + "/DataFile/sample.xml");
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();
}
}
}
Kết quả:
2. Ghi file XML
Để ghi file XML sử dụng DOM XML parser, các bạn hãy xem đoạn code sample sau:
package XML;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
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;
public class WriteXML {
public static final String xmlFilePath = System.getProperty("user.dir") + "/DataFile/output.xml";
public static void main(String argv[]) {
try {
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
// root element
Element root = document.createElement("company");
document.appendChild(root);
// employee element
Element employee = document.createElement("employee");
root.appendChild(employee);
// set an attribute to staff element
Attr attr = document.createAttribute("id");
attr.setValue("10");
employee.setAttributeNode(attr);
//you can also use staff.setAttribute("id", "1") for this
// firstname element
Element firstName = document.createElement("firstname");
firstName.appendChild(document.createTextNode("Nguyen"));
employee.appendChild(firstName);
// lastname element
Element lastname = document.createElement("lastname");
lastname.appendChild(document.createTextNode("Hai"));
employee.appendChild(lastname);
// email element
Element email = document.createElement("nickname");
email.appendChild(document.createTextNode("deft"));
employee.appendChild(email);
// department elements
Element department = document.createElement("marks");
department.appendChild(document.createTextNode("95"));
employee.appendChild(department);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File(xmlFilePath));
transformer.transform(domSource, streamResult);
System.out.println("Done creating XML File");
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (TransformerException tfe) {
tfe.printStackTrace();
}
}
}
Output: output.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<employee id="10">
<firstname>Nguyen</firstname>
<lastname>Hai</lastname>
<nickname>deft</nickname>
<marks>95</marks>
</employee>
</company>
3. Append file XML
Để thêm phần tử vào file XML mình đã tạo ở trên, các bạn hãy xem đoạn code sample sau:
package XML;
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.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class AppendXML {
public static final String xmlFilePath = System.getProperty("user.dir") + "/DataFile/output.xml";
public static void main(String argv[]) {
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory
.newDocumentBuilder();
Document document = documentBuilder.parse(xmlFilePath);
// root element
Element root = document.getDocumentElement();
// employee element
Element employee = document.createElement("employee");
root.appendChild(employee);
// set an attribute to staff element
Attr attr = document.createAttribute("id");
attr.setValue("11");
employee.setAttributeNode(attr);
//you can also use staff.setAttribute("id", "1") for this
// firstname element
Element firstName = document.createElement("firstname");
firstName.appendChild(document.createTextNode("Hoang"));
employee.appendChild(firstName);
// lastname element
Element lastname = document.createElement("lastname");
lastname.appendChild(document.createTextNode("Nguyen"));
employee.appendChild(lastname);
// email element
Element email = document.createElement("nickname");
email.appendChild(document.createTextNode("tom"));
employee.appendChild(email);
// department elements
Element department = document.createElement("marks");
department.appendChild(document.createTextNode("90"));
employee.appendChild(department);
root.appendChild(employee);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(xmlFilePath);
transformer.transform(domSource, streamResult);
System.out.println("Done append XML File");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Output: output.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<employee id="10">
<firstname>Nguyen</firstname>
<lastname>Hai</lastname>
<nickname>deft</nickname>
<marks>95</marks>
</employee>
<employee id="11">
<firstname>Hoang</firstname>
<lastname>Nguyen</lastname>
<nickname>tom</nickname>
<marks>90</marks>
</employee>
</company>
4. Lời kết
Như vậy mình đã giới thiệu xong cách làm việc với XML file trong Java. Cảm ơn các bạn đã theo dõi bài viết của mình. Hẹn gặp lại các bạn ở những chủ đề tiếp theo. Chúc các bạn thành công. Bái bai.
Nguồn:
https://shareprogramming.net/cach-doc-ghi-xml-trong-java-voi-dom-parser/