Java 操作XML[方式一] (org.w3c.dom)

  • DOM
    • Document Object Model 文档对象模型, 擅长读(小规模)/写, 直观易用
    • 其处理方式是将XML整个作为类似树结构的方式读入内存中以便操作及解析, 方便修改.
      所以当解析大数据量的XML文件时, 有内存泄漏及程序崩溃的风险.
    • DOM类
      • DocumentBuilder解析类, parse方法
      • Node节点主接口, getChildNodes返回一个NodeList
      • NodeList节点列表, 每一个元素是一个Node
      • Document文档根节点
      • Element标签节点元素(每一个标签都是标签节点)
      • Text节点(包含在XML元素内的, 都算Text节点)
      • Attr节点(每一个属性节点)
// XML_DOMReadWrite.java
package hello;

import org.w3c.dom.*;

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 java.io.File;

public class XML_DOMReadWrite {
    public static void main(String[] args) {
//        recursiveTraverse();

//        traverseBySearch();
        writeXml();
    }

    /**
     * 从上到下访问xml
     */
    public static void recursiveTraverse() {
        try {
            // 采用Dom解析xml文件
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse("users.xml");

            // 获取所有的一级子菜单
            NodeList usersList = doc.getChildNodes();
            for (int i = 0; i < usersList.getLength(); i++) {
                Node users = usersList.item(i);
                NodeList userList = users.getChildNodes(); // 获取二级子节点user的列表

                for (int j = 0; j < userList.getLength(); j++) {
                    Node user = userList.item(j);
                    if (user.getNodeType() == Node.ELEMENT_NODE) {
                        NodeList metaList = user.getChildNodes();
                        for (int k = 0; k < metaList.getLength(); k++) { // 7
                            // 到最后一级菜单
                            Node meta = metaList.item(k);
                            if (meta.getNodeType() == Node.ELEMENT_NODE) {
                                System.out.println(metaList.item(k).getNodeName() + ":" + metaList.item(k).getTextContent());
                            }
                        }
                        System.out.println("-------");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据名称进行搜索
     */
    public static void traverseBySearch() {
        try {
            // 采用 Dom 解析xml文件
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse("users.xml");

            Element rootEle = doc.getDocumentElement();
            NodeList nodeList = rootEle.getElementsByTagName("name");
            if (nodeList != null) {
                for (int i = 0; i < nodeList.getLength(); i++) {
                    Element ele = (Element) nodeList.item(i);
                    System.out.println(ele.getNodeName() + " = " + ele.getTextContent());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 写xml文件
     */
    public static void writeXml() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.newDocument(); // 新创建一个Document节点
            if (doc != null) {
                Element docx = doc.createElement("document"); // 都采用Document创建元素
                Element ele1 = doc.createElement("ele1");
                ele1.setAttribute("type", "pragraph");
                ele1.setAttribute("alignment", "left"); // element增加两个属性

                Element ele2 = doc.createElement("ele2");
                ele2.setAttribute("type", "text");
                ele2.setAttribute("alignment", "right");

                Element ele3 = doc.createElement("ele3");
                ele3.appendChild(doc.createTextNode("aaa")); // 给节点赋值

                ele1.appendChild(ele3);
                docx.appendChild(ele1);
                docx.appendChild(ele2);
                doc.appendChild(docx);

                TransformerFactory tf = TransformerFactory.newInstance();
                Transformer transformer = tf.newTransformer();
                DOMSource source = new DOMSource(doc);

                // 定义目标文件
                File file = new File("dom_write_test.xml");
                StreamResult result = new StreamResult(file);

                // 将xml内容写入到文件中
                transformer.transform(source, result);
                System.out.println("write xml file successfully");

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

<!-- users.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="001">
        <name>Mary</name>
        <age>3</age>
        <sex>Female</sex>
    </user>
    <user id="002">
        <name>Mike</name>
        <age>18</age>
        <sex>Male</sex>
    </user>
    <user id="003">
        <name>ZhaZhaHui</name>
        <age>38</age>
        <sex>Male</sex>
    </user>
</users>
<!-- dom_write_test.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document>
    <ele1 alignment="left" type="pragraph">
        <ele3>aaa</ele3>
    </ele1>
    <ele2 alignment="right" type="text"/>
</document>
原文地址:https://www.cnblogs.com/sweetXiaoma/p/12653321.html