XML解析方法详解

简介:

今日目标:DOM、 SAX、 STAX、 XML解析API

今日重点:JAXP DOM解析 、JAXP SAX解析、XML PULL解析。

XML现在已成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。深入了解前端知识更能充分解决自动化的异常类问题。

 一、

1、XML有三种解析方式:DOM SAX STAX

2、XML的作用(企业应用):存储数据、配置文件、传输数据。

 存储和传输数据经常一起使用,XML数据通常由程序生成的,用程序解析XML(XML一般不加约束)

 配置文件单独使用(通常会加约束)

3、DOM

 全称为:Document Object Model文档对象模型。

 DOM的解析思想 :将整个XML数据读取到内存中,在内存中形成文档树形结构,

 对内存中文档树形结构进行操作。

 优点:API简单。因为一次性加载整个文档,文档所有数据都在内存中,所以简便易用 处理

 较方便。可频繁修改XML文件内容(即可回写)。

 缺点:需将整个XML文档加载到内存,消耗系统资源。速度较慢。当XML文档过大时,会导致

      无法全部加载进内存,内存溢出问题。

**DOM是官方提供的XML解析标准,由W3C制定 。

4、SAX

 全称为:Simple API for XMl简单XML解析API。

 SAX解析思想:为解析器绑定回调程序Handler , 解析器读取xml文件,触发相应事件,

 自动调用handler中对应事件方法

 优点:SAX是轻量级的接口,解析速度快,无须占用太多内存资源。

 缺点:SAX每次都要从头到尾遍历节点,修改不易实现。编程复杂,如在内存中不保留读取的数据,将无法回写。

      注:如果SAX、STAX在内存中边读边保存数据的话 ,就类似于DOM了。

**SAX是民间XML解析标准,来自XML社区。

**采用“推”模式,PUSH。

5、STAX

 全称是:Streaming API for XML ,XML解析流API。

 STAX解析思想 :提高SAX模式解析效率。亦为边读边处理。

**采用“拉”模式,PULL。

*****以上三种解析方式:性能比较::STAX >SAX >DOM

6、什么是推模式?什么是拉模式?

PUSH:是以服务器为主,控制操作流程模式。

  当你将文档和处理程序 交给解析器,解析器自动进行解析,调用相应事件处理方法 (该过程不由你自己控制)。

  服务器主动向客户端发送信息,发送过程中客户端不能干预 。

PULL:是以客户端为主,控制操作流程模式。


********

JAXP: 

 全称是Java API for XML Processing。

 它是一套API。DOM、SAX、STAX只是XML的解析思想。JAXP是DOM、SAX、STAX的API具体实现。

 由SUN提供 ,在JDK 6.0以后全面支持DOM、SAX、STAX三种解析方式。

XML PULL:拉模式解析XML框架,内置集成Android手机内部 。

DOM4J:DOM解析方式框架,开源。在企业端JavaEE 软件开发中。为最流行开发框架。

javax.xml核心xml解析API,是DOM、SAX、STAX公用API。

org.w3c.dom 与DOM解析相关具体API

org.xml.sax 与SAX解析相关具体API


整个XML会被解析为树形结构,元素、属性、文本,都会被解析为 Node节点 。

********

7、DOM解析入门:

(一)

(1)创建解析器工厂

 DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();

(2)根据解析器工厂获得解析器

 DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();

(3)解析器读取XML文档进行解析,为Document对象(文档对象,代表整个XML文档)

 Document document=documentBuilder.parse("test.xml");

(4)获得document文档后,就可以对它进行操作了。

例如 :可以通过getElementsByTagName查找指定名称元素NodeList。

 NodeList nodeList=document.getElementsByTagName("name");

然后遍历集合获得每个Node节点。

for(int i=0;i<nodeList.getLength();i++){

   Element node=(Element)nodeList.item(i);

   再通过Node的getTextContent获得节点文本内容 。

   System.out.println(node.getTextContent());

  }


(二)**node节点公共API中,

getNodeName()返回节点的名称 

getNodeType()返回节点的类型 

getNodeValue()返回节点的值 


(三)**XML 提供数据只能通过两种情况 :

第一种 <name>xml解析技术</name> 第二种 <book id="001">

* 获得元素文本子节点内容  获得元素后 element.getTextContent()  element.getFirstChild().getNodeValue()

* 获得元素属性值  获得元素后 element.getAttribute(属性名)


(四)节点元素查询时

1、全局查找缩小范围

2、相对位置查找 父亲 儿子 兄弟 获得相对节点元素内容

注意事项

1、查询元素子节点时,注意回车换行 

2、Document 类中 getElementById --- 使用时 xml文档必须有约束 DTD默认加载 , Schema需要编程


(五)对XML 进行增删改查 ---- 增加 、修改 、删除

* 对内存XML 文档修改后,回写到xml 文件中


添加节点 1、创建目标节点 document.createXXX 2、找到合适位置插入 父节点.appendChild

修改节点 1 修改文本内容 element.setTextContent(value) 2 修改属性 element.setAttribute(name,value)

删除节点 1 获得要删除节点o  2. o.getParentNode().removeChild(o);

**(详细代码参见代码附录)


8、JAXP SAX 解析API

原理见上。

事件

startDocument 文档开始事件

startElement 元素开始事件

characters 文本元素事件

endElement 元素结束事件

endDocument 文档结束事件


对于SAX编程不要求掌握,了解原理就可以了。


在startElement 中 获得 开始元素是什么?qName  获得开始标签属性内容 ?attributes.getValue("属性名称")

在characters 中 获得读取到文本元素是什么 ? new String(ch,start,length)

在endElement 中 获得当前结束元素是什么 ?qName


9、XML Pull 解析器

(一)为开源框架 ,使用STAX类似拉模式解析方式。Android手机系统内置 工具类库。

** 从事Android开发 。因为内置,无需下载任何jar包 ---- 如果从事JavaEE开发需要单独下载pull解析器类库。

**在pull 解析器官网上,看到pull解析器 API接口 。

**XNI2 XmlPull 、XPP3/MXP1 、kXML2 都是 pull解析器 接口API 的实现 

**课程采用 xpp3 这套 pull解析器实现。

(二)什么是jar 包?

很多开源框架,会将class文件用zip格式进行压缩 获得压缩包。扩展名 jar (jar包)

(三)XML PULL 快速入门


(1)、去官网下载 zip 压缩包(xpp3-1.1.3.4.C_all.zip),解压缩获得jar包(xpp3-1.1.3.4.C.jar)。

(2)、在当前工程目录下新建lib文件夹,将该jar包放到lib目录下。

(3)、右击jar包,Add to build path 将jar包添加到 当前工程 build path.


事件

start document

start tag

text

end tag

end document


**使用pull解析器生成XML

(1)、获得解析器工厂

 XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();

(2)、通过解析器工厂 获得序列化程序对象 XmlSerializer

 XmlPullParser parser = parserFactory.newPullParser();

(3)、设置 输出XML文件 位置

(4)、开始写  存在5个方法写你需要内容


*** 能力: 将List中数据 序列化到一个XML文件中 。


10、XML PULL 解析方式 与 SAX push 最大区别?

程序员可以自己控制解析过程 。

用push 自动执行所有解析事件,使用pull 程序员可以控制只执行关注的那些事件,pull解析方式效率比push方式更高。


**获得元素属性 ----- 在元素开始时 ,通过parser.getAttributeValue(null,属性名称);

获得元素内部文本内容 ----- 在元素开始时, parser.nextText();


11、XML PULL 对xml文件 进行CURD (Create Update Read Delete) 

* 使用pull 读取xml,读取内容不释放,在内存中保留 ---- DOM 类似

* 解析XML --- List 序列化 List --- XML 

* 使用pull 进行增删改查 --- 读取xml全部数据保存内存list对象,对内存list对象进行增删改查。



本文转自 honzhang 51CTO博客,原文链接:http://blog.51cto.com/hongz/2054852
相关文章
|
2月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
206 1
|
4月前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
653 89
|
2月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
90 15
|
3月前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
241 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
5月前
|
存储 Java 开发者
浅析JVM方法解析、创建和链接
上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
385 132
|
2月前
|
JSON 监控 网络协议
Bilibili直播信息流:连接方法与数据解析
本文详细介绍了自行实现B站直播WebSocket连接的完整流程。解析了基于WebSocket的应用层协议结构,涵盖认证包构建、心跳机制维护及数据包解析步骤,为开发者定制直播数据监控提供了完整技术方案。
|
2月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
85 1
|
2月前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
110 5
|
5月前
|
安全 Ubuntu Shell
深入解析 vsftpd 2.3.4 的笑脸漏洞及其检测方法
本文详细解析了 vsftpd 2.3.4 版本中的“笑脸漏洞”,该漏洞允许攻击者通过特定用户名和密码触发后门,获取远程代码执行权限。文章提供了漏洞概述、影响范围及一个 Python 脚本,用于检测目标服务器是否受此漏洞影响。通过连接至目标服务器并尝试登录特定用户名,脚本能够判断服务器是否存在该漏洞,并给出相应的警告信息。
335 84
|
5月前
|
数据可视化 项目管理
个人和团队都好用的年度复盘工具:看板与KPT方法解析
本文带你了解高效方法KPT复盘法(Keep、Problem、Try),结合看板工具,帮助你理清头绪,快速完成年度复盘。
337 7
个人和团队都好用的年度复盘工具:看板与KPT方法解析

推荐镜像

更多