三类XML文件的解析方法

2023-11-19

XML文件的解析

mybatis的学习当中,配置的加载传统的是通过解析用户配置的文件,获取到数据库连接与对象实体映射关系的,书中有描述到DOM\SAX\StAX 几种方案,一方面是夯实基础,一方面是了解三种方法的优缺点,今天就学习一下XML文件的解析

一、XML的解析方式

  • DOM 解析XML底层接口之一,跨平台,跨语言
  • SAX 解析XML底层接口之一
  • Jdom/dom4J 基于底层API的封装,Java语言,更方便便捷

二、DOM解析

DOM 解析的原理:树形结构,依赖内存加载文件,树在内存中持久化存储,映射成Document对象,解析DOM树,识别父节点、当前节点、兄弟节点和子节点,在节点间游历,就能够获取到整棵树的数据。操作简易,消耗大,适用于小文档或者需要频繁修改文档的场景。

使用JDK自带的DocumentBuilderFactory进行解析

//生成工厂实例
  DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//创建builder实例
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        //读取文件内容,加载入Document对象
        Document document = documentBuilder.parse("store.xml");
        //根据Name获取节点
        NodeList productList = document.getElementsByTagName("product");
       for(int i =0;i<productList.getLength();i++){
           Node product = productList.item(i);
           Node firstChild = product.getFirstChild();
           Node lastChild = product.getLastChild();
           String nodeName = product.getNodeName();
           short nodeType = product.getNodeType();
           String nodeValue = product.getNodeValue();
           //获取节点内容
           NamedNodeMap namedNodeMap = product.getAttributes();
           for(int j=0;j<namedNodeMap.getLength();j++){
               Node node = namedNodeMap.item(j);
               String name = node.getNodeName();
               String value = node.getNodeValue();
               short type = node.getNodeType();
               System.out.println("name:"+name+";value:"+value);
           }
           //获取子节点内容
           NodeList childNodes = product.getChildNodes();
           for(int k =0 ;k<childNodes.getLength();k++){
               Node item = childNodes.item(k);
               String itemNodeName = item.getNodeName();
               short itemNodeType = item.getNodeType();
               String itemNodeValue = item.getNodeValue();
               System.out.println("itemName:"+itemNodeName+";itemValue:"+itemNodeValue);

               NodeList children = item.getChildNodes();
               for(int m =0;m<children.getLength();m++){
                   Node item1 = children.item(m);
                   System.out.println("itemName:"+item1.getNodeName()+";itemValue:"+item1.getNodeValue());
               }
           }
       }

三、SAX解析

SAX解析原理:基于事件的模型,不需要将全部文档加载入内存,只需要用户读取的时候加载相应的内容片段即可,响应快,消耗小,适用于大型文档读取的场景。

使用JDK自带的SAXParserFactory

  • 创建一个用于解析的Handler, 重写父类的关于片段解析的代码
public class SaxHandler extends DefaultHandler {
    private List<Product> products = null;
    private Product product;
    private String currentTag = null;
    private String currentValue = null;
    private String nodeName = null;

    public SaxHandler(String nodeName) {
        this.nodeName = nodeName;
    }

    public List<Product> getProducts() {
        return products;
    }


    @Override
    public void startDocument() throws SAXException {
        // 读到一个开始标签会触发
        super.startDocument();

        products = new ArrayList<Product>();
    }

    @Override
    public void endDocument() throws SAXException {
        //自动生成的方法存根
        super.endDocument();
    }

    @Override
    public void startElement(String uri, String localName, String name,
                             Attributes attributes) throws SAXException {
        //文档的开头调用
        super.startElement(uri, localName, name, attributes);

        if (name.equals(nodeName)) {
            product = new Product();
        }
        if (attributes != null && product != null) {
            for (int i = 0; i < attributes.getLength(); i++) {
                if (attributes.getQName(i).equals("id")) {
                    product.setId(Integer.valueOf(attributes.getValue(i)));
                }
            }
        }
        currentTag = name;
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //处理在XML文件中读到的内容
        super.characters(ch, start, length);

        if (currentTag != null && product != null) {
            currentValue = new String(ch, start, length);
            if (!currentValue.trim().equals("") && !currentValue.trim().equals("\n")) {
                if (currentTag.equals("name")) {
                    product.setName(currentValue);
                } else if (currentTag.equals("price")) {
                    product.setPrice(Double.valueOf(currentValue));
                }else if(currentTag.equals("inventory")){
                    product.setInventory(Integer.valueOf(currentValue));
                }
            }
        }
        currentTag = null;
        currentValue = null;
    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        // 结束标签的时候调用
        super.endElement(uri, localName, name);

        if (name.equals(nodeName)) {
            products.add(product);
        }
    }

}
  • 创建一个用于接收的对象(别的数据结构也可)
public class Product {
    private Integer id;
    private String name;
    private Double price;
    private Integer inventory;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Integer getInventory() {
        return inventory;
    }

    public void setInventory(Integer inventory) {
        this.inventory = inventory;
    }

    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", inventory=" + inventory +
                '}';
    }
}
  • 读取文件,并使用Handler进行解析
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        SAXParser saxParser = saxParserFactory.newSAXParser();
        SaxHandler saxHandler = new SaxHandler("product");
        saxParser.parse(new InputSource("store.xml"), saxHandler);
        List<Product> products = saxHandler.getProducts();
        products.forEach(System.out::println);

四、JDOM/Dom4J

  • JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快

  • Dom4J,是JDOM 的一种智能分支,合并了许多超出基本 XML 文档表示的功能

  • 以下为Dom4j为例

  • 添加maven依赖

       <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
  • 读取xml文件
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(new File("store.xml"));
  • 处理解析逻辑
        Element rootElement = document.getRootElement();
        List<Element> elements = rootElement.elements();
        List<Product> products = new ArrayList<>();
        for(Element element : elements){
            Integer id = Integer.valueOf(element.attributeValue("id"));
            String name = element.element("name").getText();
            Double price = Double.valueOf(element.element("price").getText());
            Integer inventory = Integer.valueOf(element.elementText("inventory"));
            Product product = new Product();
            product.setId(id);
            product.setName(name);
            product.setPrice(price);
            product.setInventory(inventory);
            
            products.add(product);
        }
        products.forEach(System.out::println);

All codes are here:this page

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三类XML文件的解析方法 的相关文章

随机推荐

  • 微信小程序:用户基本信息的采集

    文章目录 写作背景 getUserInfo与getUserProfile open data 头像昵称填写能力 总结 写作背景 在开发商城小程序时需要显示用户头像 昵称 手机号等信息以便后续业务的实现 因此需要通过微信小程序的API采集用户
  • ​【机器学习】数据科学中 17 种相似性和相异性度量(上)

    本文解释了计算距离的各种方法 并展示了它们在我们日常生活中的实例 限于篇幅 便于阅读 将本文分为上下两篇 希望对你有所帮助 There is no Royal Road to Geometry 欧几里得 简介 相似性和相异性 在数据科学中
  • JFinal DB.tx()事务

    1 发现问题 1 功能实现逻辑 添加一个新的系统的时候 先添加系统本身 即名称 地址 简介 将这些存入system表 得到system id 添加系统所处的服务器 由于有专门的添加服务器功能 所以这里的服务器只用填地址 如果地址对应服务器不
  • Qt设置软件启动动画(支持图片和视频俩种方式)

    目录 软件启动动画效果 静态背景 动态背景 程序启动动画 QSplashScreen 启动时加载静态图片 启动时加载视频动画 将启动动画置于所有窗口顶层 软件启动动画效果 先来看效果 下面录制了加载图片和gif动图的俩种效果 静态背景 动态
  • Mysql主从复制

    Mysql主从复制原理 1 主库开始二进制日志 binlog 2 从库执行change master 执行主库 此时主库会创建一个dump线程 用于向从库发送二进制日志 3 从库执行 start slave 开启IO SQL线程 IO线程
  • 搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了

    点击上方 视学算法 选择加 星标 或 置顶 重磅干货 第一时间送达 作者丨科技猛兽 编辑丨极市平台 Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型 现在比较火热的 Bert 也是基于 Trans
  • QFileInfo主要函数详解

    部分内容来自 https blog csdn net Amnes1a article details 65444966 QFileInfo主要函数详解 QFileInfo简介 扩展 文件名和路径类 文件访问权限类 文件所有者类 文件相关日期
  • 将XML格式文件转换JSON文件格式

    XMl文件转JSON字符串 1 1Maven引入依赖
  • 光栅尺的相关知识

    光栅尺的相关知识 1 光栅尺的原理 2 光栅尺的精度 3 光栅尺的制造 4 增量式光栅尺和绝对式光栅尺的区别 5 光栅尺的选择 6 光栅尺与编码器 1 光栅尺的原理 我们可以类比普通卷尺 尺子上面有刻度 以这些刻度作为基准 你只需要把要测的
  • texlive支持中文的简单方法

    1 确保tex文件的编码方式是UTF 8 2 在文档开始处添加一行命令即可 即 usepackage UTF8 ctex 如下所示 documentclass article usepackage UTF8 ctex begin artic
  • [机缘参悟-86]:清心寡欲,世外修行 ?负剑下山,闯荡江湖?

    天地者 万物之逆旅也 光阴者 百代之过客也 而浮生若梦 为欢几何
  • Android Fragment 真正的完全解析(下)

    本篇将介绍上篇博客提到的 如何管理Fragment回退栈 Fragment如何与Activity交互 Fragment与Activity交互的最佳实践 没有视图的Fragment的用处 使用Fragment创建对话框 如何与ActionBa
  • 5月10日 ksjsb抓包教程,小黄鸟无需ROOT抓包

    1 先下载抓包工具 小黄鸟 自己搜索 注意 这里下载完小黄鸟app后 安装打开时 该下载的安全证书下载 手机root权限该给的都给 2 打开小黄鸟工具 添加目标应用 快手极速版 3 启动小黄鸟 然后退出让它后台运行 打开快手极速版到菜单栏找
  • Windows下PP-Tracking多目标跟踪数据训练

    PP Tracking之手把手玩转多目标跟踪 飞桨AI Studio 人工智能学习与实训社区PP Tracking之手把手玩转多目标跟踪 飞桨AI Studio 人工智能学习与实训社区https aistudio baidu com ais
  • IDEA2023.1.3自带插件禁用,减少内存占用

    前言 前两个星期安装了idea2023 1 3 之前用的一直是idea2020 3版本 我发现新版界面确实更好看一些 而且启动速度也非常快 打开多个项目也一样很快 都是秒开 但是吧 它的内存占用比idea2020 3版高了很多 刚打开的时候
  • TensorRT Samples: GoogleNet

    关于TensorRT的介绍可以参考 http blog csdn net fengbingchun article details 78469551 以下是参考TensorRT 2 1 2中的sampleGoogleNet cpp文件改写的
  • 【前端面经】instanceof相关知识

    原理 instanceof是javascript语言中的一个运算符 用于检测一个对象是否是一个类或者构造函数的实例 它的语法是boject instanceof constructor 其中object是要检测的对象 constructor
  • JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现

    JS常见加密 AES DES RSA MD5 SHAI HMAC Base64 Python JS实现 文章目录 JS常见加密 AES DES RSA MD5 SHAI HMAC Base64 Python JS实现 前言 一 编码 加密
  • 数据结构(C语言)——双链表

    有了单链表的编写经验 双链表变得格外容易 点击看前一篇 单链表 下面是代码 include
  • 三类XML文件的解析方法

    XML文件的解析 mybatis的学习当中 配置的加载传统的是通过解析用户配置的文件 获取到数据库连接与对象实体映射关系的 书中有描述到DOM SAX StAX 几种方案 一方面是夯实基础 一方面是了解三种方法的优缺点 今天就学习一下XML