今日重点: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对象进行增删改查。
原文地址:http://blog.51cto.com/hongz/2054852