文章目录

  • 一.DOM(Document Object Model)基本介绍
  • 二. java 编码实现解析xml
  • 1.xml文件的内容
  • 2.XML与java对象之间的转换


一.DOM(Document Object Model)基本介绍

一个XML文件加载进内存的时候,在内存中形成所谓的一种树状结构

【优点】

  • 形成了树结构,直观易于理解,代码更易编写。
  • 解析过程中树结构保存在内存中,方便修改

【缺点】

  • 当XML文件较大的时候,最内存耗费比较大,容易影响解析性能并且可能会造成内存溢出。

二. java 编码实现解析xml

1.xml文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <person id="1">
        <name>Tom</name>
        <age>20</age>
    </person>
    <person id="2">
        <name>Mary</name>
        <age>25</age>
    </person>
</root>

2.XML与java对象之间的转换

package test_dom;

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.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        try {
            // 获取 DOM 解析器工厂实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            // 获取 DOM 解析器
            DocumentBuilder builder = factory.newDocumentBuilder();

            // 解析XML文件
            Document doc = builder.parse(new File("C:\\Users\\mats\\IdeaProjects\\xmlParse\\src\\resource\\xml\\dom_test.xml"));

            // 获取根节点
            Element root = doc.getDocumentElement();

            // 获取 person 节点列表
            NodeList personList = root.getElementsByTagName("person");

            // 遍历 person 节点列表
            for (int i = 0; i < personList.getLength(); i++) {
                Node node = personList.item(i);

                // 判断当前 person 节点是否为 id=2 的节点
                if (node instanceof Element && "2".equals(((Element) node).getAttribute("id"))) {
                    Element person = (Element) node;
                    // 修改 age 节点的值
                    NodeList ageList = person.getElementsByTagName("age");
                    if (ageList.getLength() > 0) {
                        //获取节点
                        System.out.print(ageList.item(0).getNodeName() + ":");
                        //获取节点值
                        System.out.println(ageList.item(0).getFirstChild().getNodeValue());
                        Element age = (Element) ageList.item(0);
                        age.setTextContent("30");
                    }
                }
            }

            // 将修改后的文档写回到原文件
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("C:\\Users\\mats\\IdeaProjects\\xmlParse\\src\\resource\\xml\\dom_test_new.xml"));
            transformer.transform(source, result);

            System.out.println("XML文件修改成功!");
        } catch (ParserConfigurationException | IOException | TransformerException | org.xml.sax.SAXException e) {
            e.printStackTrace();
        }
    }
}