XML解析方法详解

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

今日目标: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月前
|
人工智能
歌词结构的巧妙安排:写歌词的方法与技巧解析,妙笔生词AI智能写歌词软件
歌词创作是一门艺术,关键在于巧妙的结构安排。开头需迅速吸引听众,主体部分要坚实且富有逻辑,结尾则应留下深刻印象。《妙笔生词智能写歌词软件》提供多种 AI 功能,帮助创作者找到灵感,优化歌词结构,写出打动人心的作品。
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
50 3
|
2月前
|
人工智能
写歌词的技巧和方法全解析:开启你的音乐创作之旅,妙笔生词智能写歌词软件
怀揣音乐梦想,渴望用歌词抒发情感?掌握关键技巧,你也能踏上创作之旅。灵感来自生活点滴,主题明确,语言简洁,韵律和谐。借助“妙笔生词智能写歌词软件”,AI辅助创作,轻松写出动人歌词,实现音乐梦想。
|
27天前
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
46 12
|
1月前
|
机器学习/深度学习 人工智能 安全
TPAMI:安全强化学习方法、理论与应用综述,慕工大、同济、伯克利等深度解析
【10月更文挑战第27天】强化学习(RL)在实际应用中展现出巨大潜力,但其安全性问题日益凸显。为此,安全强化学习(SRL)应运而生。近日,来自慕尼黑工业大学、同济大学和加州大学伯克利分校的研究人员在《IEEE模式分析与机器智能汇刊》上发表了一篇综述论文,系统介绍了SRL的方法、理论和应用。SRL主要面临安全性定义模糊、探索与利用平衡以及鲁棒性与可靠性等挑战。研究人员提出了基于约束、基于风险和基于监督学习等多种方法来应对这些挑战。
58 2
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
21 1
|
2月前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
172 2
|
2月前
|
SQL 监控 数据库
SQL语句是否都需要解析及其相关技巧和方法
在数据库管理中,SQL(结构化查询语言)语句的使用无处不在,它们负责数据的查询、插入、更新和删除等操作
|
2月前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
59 5
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器

推荐镜像

更多