Cách đọc, ghi XML trong Java với DOM Parser

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.

Đọ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 Main {

    public static void main(String[] args) {

        try {
            File inputFile = new File("input.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();
        }
    }
}

Output:

Root element :class
----------------------------

Current Element :student
Student roll no : 400
First Name : Nguyen
Last Name : Hai
Nick Name : deft
Marks : 12

Current Element :student
Student roll no : 103
First Name : Nguyen
Last Name : Tu
Nick Name : vinni
Marks : 95

Current Element :student
Student roll no : 593
First Name : Le
Last Name : dung
Nick Name : jazz
Marks : 90

Ghi file XML

Để ghi file XML sử dụng DOM XML parser, theo dõi đoạn mã sau:

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 Main {

    public static final String xmlFilePath = "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>

Nguồn

https://mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x