今日目标: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对象进行增删改查。