XML-DOM SAX解析

2024-09-06 09:38
文章标签 xml 解析 dom sax

本文主要是介绍XML-DOM SAX解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

XML基础

                1)XML的作用

                                1.1 作为软件配置文件

                                1.2 作为小型的“数据库”

                2)XML语法(由w3c组织规定的)

                                标签: 

                                                标签名不能以数字开头,中间不能有空格,区分大小写。有且仅有一个根标签。

                                属性:           

                                                可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单                                                双混用。

                                文档声明:

                                                <?xml version="1.0"encoding="utf-8"?>      

                                                encoding="utf-8": 打开或解析xml文档时的编码

                                                注意:

                                        保存xml文档时的编码 和 解析xml文档时的编码要保持一致,才能避免中文乱码问题!

                3)XML解析

                                程序读取或操作xml文档

 

                                两种解析方式:   DOM解析   vs   SAX解析

 

                                DOM解析原理:一次性把xml文档加载成Document树,通过Document对象得到节点对象,通过节点对象访问xml文档内容(标签,属性,文本,注释)。

 

                                Dom4j工具(基于DOM解析原理):

                                                读取xml文档:

                                                            Document doc = newSAXReader().read("xml文件");

 

                                                节点:

                                                                nodeIterator();  所有节点

                                                标签:

                                                                element("名称")   指定名称的第一个子标签对象

                                                                elementIterator("名称");  指定名称的所有子标签对象

                                                                elements();  所有子标签对象

                                                属性:

                                                                attributeValue(“名称”)指定名称的属性值

                                                                attribute("名称")   指定名称的属性对象

                                                                                getName()  属性名称

                                                                                getValue()  属性值

                                                                atributeIterator()   所有属性对象(Iterator)

                                                                attributes()       所有属性对象(List)

                                                文本:

                                                                getText()  得到当前标签的文本

                                                                elementText("子标签名称")  得到子标签的文本

               

                               

今天的目标:     Dom4J修改xml   + xPath技术  + SAX解析 + XML约束

2 Dom4j修改xml文档

                2.1 写出内容到xml文档

                                XMLWriter writer = newXMLWriter(OutputStream, OutputForamt)

                                wirter.write(Document);

 

                2.2 修改xml文档的API

                        增加:

                                        DocumentHelper.createDocument()  增加文档

                                        addElement("名称")  增加标签

                                        addAttribute("名称",“值”)  增加属性

                        修改:

                                        Attribute.setValue("值")  修改属性值

                                        Element.addAtribute("同名的属性名","值")  修改同名的属性值

                                        Element.setText("内容")  修改文本内容

                        删除

                                        Element.detach();  删除标签 

                                        Attribute.detach();  删除属性

3 xPath技术 

                        3.1引入

                        问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!

                        3.2xPath作用

                                主要是用于快速获取所需的节点对象。

 

                        3.3在dom4j中如何使用xPath技术

                                1)导入xPath支持jar包。  jaxen-1.1-beta-6.jar

                                2)使用xpath方法

                                                List<Node>  selectNodes("xpath表达式");   查询多个节点对象

                                                Node       selectSingleNode("xpath表达式");  查询一个节点对象

                               

                        3.4xPath语法

                                /     绝对路径      表示从xml的根位置开始或子元素(一个层次结构)

                                //    相对路径       表示不分任何层次结构的选择元素。

                                *     通配符         表示匹配所有元素

                                []     条件           表示选择什么条件下的元素

                                @    属性            表示选择属性节点

                                and    关系          表示条件的与关系(等价于&&)

                                text()   文本           表示选择文本内容

                 3.5 案例

                                用户登录功能:

                                        用户输入用户名和密码 -> 到“数据库”查询是否有对应的用户->

                                                有: 则表示登录成功

                                                没有: 则表示登录失败

 

                                用xml当做数据库

                                                user.xml   用来存储用户的数据

 

4 SAX解析

                        4.1回顾DOM解析

                                DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。

                                                                对内存要求比较要。   

                                                缺点: 不适合读取大容量的xml文件,容易导致内存溢出。

                                       

                                SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。

 

                        4.2SAX解析工具    

                                        SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

 

                                        核心的API:

                                                  SAXParser类: 用于读取和解析xml文件对象

                                                                parse(File f, DefaultHandler dh)方法:解析xml文件

                               

                                                参数一: File:表示 读取的xml文件。

                                            参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

例如:{

                  1.创建SAXParser对象 

              SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

                  2.调用parse方法

            parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

}               [一个类继承class 类名(extendsDefaultHandler 在调用是创建传进去

 

                                DefaultHandler类的API:

                                                void startDocument()  :  在读到文档开始时调用

                                                void endDocument()  :在读到文档结束时调用

                                                voidstartElement(String uri, String localName, String qName, Attributes attributes) :读到开始标签时调用                             

                                                voidendElement(String uri, String localName, String qName)   :读到结束标签时调用

                                                voidcharacters(char[] ch, int start, int length) 读到文本内容时调用

 

                               

                                        ============DOM解析    vs  SAX解析             ========

       

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

 

                总结:

                                1)Dom4j修改xml文档

                                         new XMLWrier();

                                                ......

                                2)xPath技术: 快速查询xml节点

                                                selectNodes()

                                                selectSinglNode();

                                        xpath表达式语言         

                                3) SAX解析

                                                SAXParser parse

                                                        parser()

                                        DefaultHandler类:

                                                        startElement();

                                                        characters();

                                                        endElement();

这篇关于XML-DOM SAX解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141665

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven