XML--03--解析 -DOM方式

DOM简介

  • DOM是Document Object Model的简称,翻译过来就是文档对象模型
  • jdk针对w3c dom结构标准的实现,是W3C组织推荐的处理可扩展标志语言的标准编程接口
  • 它以面向对象的方式描述了文档模型,所以有一个名词叫对象树,也叫文档树
    在这里插入图片描述

关于这个文档树,有几个名词需要知道:

节点(Node):XML中的每个成分都是节点

  • 文档节点:即图中的:Document
  • 每个标签是一个原元素节点即:Element
  • XML元素标签之间的为文本节点:TextNode
  • 每个XML元素节点的属性为属性节点:Attribute

xml常见的节点类型

  • Node : DOM最基本的数据类型
  • Element:常见的元素节点
  • Attr:代表元素的属性
  • Text:元素或者Att的值(内容)
  • Document:代表整个XML文档

DOM解析XML

解析步骤:

  1. 建立DocumentBuilderFactor,用于获得DocumentBuilder对象:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

  1. 建立DocumentBuidler:

DocumentBuilder builder = factory.newDocumentBuilder();

  1. 建立Document对象,获取树的入口:

Document doc = builder.parse(“xml文件的相对路径或者绝对路径”);

  1. 建立NodeList:

NodeList n1 = doc.getElementByTagName(“读取节点”);

  1. 进行xml信息获取

DOM的一些常用的方法:

  • Document.getDocumentElement():返回xml文档的根元素
  • Element.getAttribute():获取属性值
  • Element.getChildNodes():返回孩子节点集
  • Element.getFirstChild():返回第一个孩子节点,通常是TextNode
  • Element.getLastChild():得到最后一个孩子节点

Node接口常用方法

在这里插入图片描述

NodeList:此接口表示一个点的集合,一般用于有序关系的一组节点。

在这里插入图片描述

案例:

1、 新建一个xml文件,users.xml

在这里插入图片描述

2、同样新建一个User类,User.java

public class User {
    private long id;
    private String name;
    private String password;

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

3、解析

第一步:加载xml资源,得到XML的Document对象
在这里插入图片描述

加载XML资源,这里和SAX一样,也可以是File或者Url

第二步:操作Doc,解析相应的数据
在这里插入图片描述

import com.cy.pojo.User;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class XmpParseUtils {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
    
        List<User> users=new ArrayList<>();

        // 1. 加载XML资源,这里和SAX一样,也可以是File或者Uri
        String url="mapper\\users.xml";
        File file = new File(url);
        // 2. 得到文档构建工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 3. 通过构建工厂生产构建类
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 4. 那这个构建类将XML资源解析得到Document对象
        Document doc = builder.parse(file);


        // 得到根节点
        Element root = doc.getDocumentElement();
        // 根据指定的标签名称得到相应的节点集合
        NodeList userNodes = root.getElementsByTagName("user");
        for(int i=0;i<userNodes.getLength();i++){
            // 依次解析每个user节点
            Element userElement = (Element) userNodes.item(i);
            // 获取user节点的属性
            int id = Integer.valueOf(userElement.getAttribute("id"));
            User user = new User();
            user.setId(id);
            // 接下来解析子元素
            NodeList childNodes = userElement.getChildNodes();
            for(int j=0;j<childNodes.getLength();j++){
                Node childNode = childNodes.item(j);
                if(childNode.getNodeType() == Node.ELEMENT_NODE){ // 判断是不是元素节点
                    String nodeName = childNode.getNodeName(); // 得到节点名称
                    String value = childNode.getFirstChild().getNodeValue(); // 得到第一个子节点的值,这里为TextNode
                    if("name".equals(nodeName)){ // 如果当前的节点为name,那么它的值就是user的name
                        user.setName(value);
                    }else if("password".equals(nodeName)){ // 如果当前的节点为password,那么它的值就是user的password
                        user.setPassword(value);
                    }
                }
            }

                users.add(user);
            }
        System.out.println(users);

        }
    }


在这里插入图片描述

总结:

DOM解析优点:

  • 整个文档树在内存中,便于操作;
  • 可以修改,删除、重新排列XML;
  • 可以随机访问任何一个节点,访问效率高。

DOM解析的缺点:

  • 占用内存大,占用资源多
  • 解析速度慢

DOM解析适用场合:

  • 需多次访问这些数据;
  • 对解析效率要求不高;
  • 硬件资源充足(内存、CPU)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值