Java之xml解析(Dom方式)

文章介绍了DOM(DocumentObjectModel)的基本概念,强调了其将XML文件转化为内存中的树状结构,便于理解和操作,但也指出大型XML文件可能导致内存消耗大和性能问题。接着,文章展示了如何用Java通过DOM解析XML文件,读取内容以及进行节点遍历。具体示例中,代码读取XML文件,找到特定id的person节点并修改其age值,最后将修改后的文档写回新的XML文件。
摘要由CSDN通过智能技术生成

一.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();
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值