Java解析xml文档之DOM解析--CRUD(增删改查)

DOM-Document Object Model-文档对像模型。

是w3c组织处理xml的一种方式。

特点:

一次将所有数据全部加载到内存中。
对xml文档中的每一个节点都当成一个Node对像处理。包括元素、文本、属性。
org.w3c.dom包中的Document,Element,Node。
非常方便进行修改。
已经集成在了JDK中,是Sun对xml操作的标准。
缺点是当文档数据量很大时,对内存有占用很大。
由于DOM解析,一次性的将所有元素(包含属性和文本) 全部加载到内存中,所以不适用于解析大量的数据

包: 

javax.xml.parse – 关键类DocumentBuilder,文档解析对像。 
org.w3c.dom – 关键类Document代表内存中的文档对像模型。
java.xml – 关键类Transformer,用于将内存中的文档保存到文件中。

注意事项:

1. 创建Document对象的方法

//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbFactory对象
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//第二步,通过dbFactory对象的newDocumentBuilder方法得到一个DocumentBuilder对象db
DocumentBuilder db = dbFactory.newDocumentBuilder();
//第三步,利用db对象的parse方法得到一个Document对象dom
Document dom = db.parse(new File("./xml4/users.xml"));
//然后进项dom操作

2.因为dom是将一棵树整个拷进内存操作 所以我们上面操作的只是内存中的dom并没有存到硬盘中去。所以我们要借助于Transformer类的transform方法持久化。

3.创建Transformer对象的方法

//第一步,用TransformerFactory的工厂方法得到一个tfFactory对象
TransformerFactory tfFactory = TransformerFactory.newInstance(); 
//第二步,用tfFactory对象的newTransformer得到一个Transformer对象tf
Transformer tf = tfFactory.newTransformer();
//第三步,用tf对象的transform方法保存
tf.transform(new DOMSource(dom), new StreamResult(new File("./xml4/users.xml")));

具体代码如下:

DomDemo1

package cn.hncu;

import java.io.File;
import java.io.IOException;

import javax.mail.internet.NewsAddress;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomDemo1 {
    @Test//需求:将第一个user的name拿出来
    public void getName() throws ParserConfigurationException, SAXException, IOException{
        //第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbFactory对象
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        //第二步,通过dbFactory对象的newDocumentBuilder方法得到一个DocumentBuilder对象db
        DocumentBuilder db = dbFactory.newDocumentBuilder();
        //第三步,利用db对象的parse方法得到一个Document对象dom
        Document dom = db.parse(new File("./xml4/users.xml"));
        //然后进项dom操作
        Element root = (Element) dom.getFirstChild();
        //System.out.println(root.getNodeName());//users
        NodeList  list =  root.getElementsByTagName("user");
        Element eUser1 = (Element) list.item(0);
        String name = eUser1.getElementsByTagName("name").item(0).getTextContent();
    //  System.out.println("name:"+name);//name:小明
    }
    //用java对dom进行CRUD--增、读、改、删操作
    //增
    @Test
    public void create() throws ParserConfigurationException, SAXException, IOException, TransformerException{
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbFactory.newDocumentBuilder();
        Document dom = db.parse(new File("./xml4/users.xml"));
        Element root = (Element) dom.getFirstChild();
        Element eUser = dom.createElement("user");
        Element eName = dom.createElement("name");
        eName.setTextContent("菲菲");
        Element eAge = dom.createElement("age");
        eAge.setTextContent(""+21);
        eUser.appendChild(eName);
        eUser.appendChild(eAge);
        root.appendChild(eUser);
        //因为dom是将一棵树整个拷进内存操作 所以我们上面操作的只是内存中的dom并没有存到硬盘中去。
        //下面就是将内存中的dom树存入硬盘中
        //第一步,用TransformerFactory的工厂方法得到一个tfFactory对象
        TransformerFactory tfFactory = TransformerFactory.newInstance(); 
        //第二步,用tfFactory对象的newTransformer得到一个Transformer对象tf
        Transformer tf = tfFactory.newTransformer();
        //第三步,用tf对象的transform方法保存
        tf.transform(new DOMSource(dom), new StreamResult(new File("./xml4/users.xml")));
    }
    //查
    @Test
    public void query() throws Exception{
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbFactory.newDocumentBuilder();
        Document dom = db.parse(new File("./xml4/users.xml"));
        Element root = (Element) dom.getFirstChild();
        NodeList users= root.getElementsByTagName("user");
        for(int i=0;i<users.getLength();i++){
            Element e = (Element) root.getElementsByTagName("user").item(i);
            String name = e.getElementsByTagName("name").item(0).getTextContent();
            String age = e.getElementsByTagName("age").item(0).getTextContent();
            System.out.println("user:"+name+",age:"+age);
            System.out.println("======================");
        }
    }
    //改
    @Test
    public void update() throws Exception{
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbFactory.newDocumentBuilder();
        Document dom = db.parse(new File("./xml4/users.xml"));
        Element root = (Element) dom.getFirstChild();
        NodeList userList= root.getElementsByTagName("user");
        Element userUpdate = (Element) userList.item(0);
        Element eName = (Element) userUpdate.getElementsByTagName("name").item(0);
        eName.setTextContent("王子是个老不死");

        //从内存写入硬盘$$$$记住
        TransformerFactory tfFactory = TransformerFactory.newInstance();
        Transformer tf = tfFactory.newTransformer();
        tf.transform(new DOMSource(dom), new StreamResult("./xml4/users.xml"));
    }
    //删除
    @Test
    public void delete() throws Exception{
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbFactory.newDocumentBuilder();
        Document dom = db.parse(new File("./xml4/users.xml"));
        Element root = (Element) dom.getFirstChild();
        NodeList userList= root.getElementsByTagName("user");
        Element userDelete = (Element) userList.item(userList.getLength()-1);
        root.removeChild(userDelete);
        //保存
        TransformerFactory tfFactory = TransformerFactory.newInstance();
        Transformer tf = tfFactory.newTransformer();
        tf.transform(new DOMSource(dom), new StreamResult("./xml4/users.xml"));
    }

}

users.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
    <user id="a001">
        <name>王子是个老不死</name>
        <age>23</age>
    </user>
    <user id="p005">
        <name>嫁衣</name>
        <age>18</age>
    </user>

</users>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值