使用DOM,SAX解析XML文档
使用DOM,SAX解析XML文档
DOM:全称:DocumentObject Model,也就是文档对象模型。
通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,
因此,这种利用DOM接口的机制也被随机访问机制。
DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式
这些分层对象模型,依据XML的文档形成一颗节点树。
对于XML应用开发者来说,DOM就是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准接口规范。
要严格区分XML文档树中的根节点,与根元素节点:根节点(Document)代表的是XML文档的本身,是我们解析XML文档的入口,而根元素节点则表示XML文档的根元素,它对应与XML文档的Root。
常见的节点类型:
1.元素时XML的基本构件,元素可以有其他元素,文本节点或者两者兼有作为其子节点。元素节点可以有属性的唯一类型的节点。
2.属性:属性节点包含关于元素节点的信息,但实际上,不认为属性是元素的子节点。
3.文本:文本节点是文本。可以包含许多信息,或者是空白。
4.文档(根节点):文档节点是整个文档中所有其他节点的父节点。(根节点不等于根元素节点)
5.较不常见的节点类型: CDATA,注释,处理指令。
DOM的四个基本接口
1.DOM的对象模型:
利用对象将文档模型化。将文档模型使用对象表示。
在DOM中对象模型要实现:
1.用来表示,操作文档的接口
2.接口的行为和属性
3.接口之间的关系以及互操作
2.Document ,Node NodeList 以及NamedNodeMan.
在这四个基本接口中,Document接口时对文档进行操作的入口,
它是从Node接口继承过来的,Node接口是其他大多数接口的父类,像Document,Element,Attribute,Text, Commend 等接口都是从Node接口中继承过来的,
NodeList接口是一个节点的集合,它包含了某个节点的所有子节点,NamedNodeMap也是一个节点的集合,通过该接口可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。
1.Document接口
1.Document接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了对文档中的数据进行访问和操作。
2.由于元素,文本节点,注释,处理指令等都不能脱离文档的上下文关系而独立存在,所以在Document接口提供了创建其他节点对象的方法,通过该方法创建的节点对象都有一个ownerDocument属性,用来表明当前节点是由谁所创建的以及节点同Document之间的关系。
2.Node接口
1.Node接口在整个DOM树中具有重要的地位,DOm接口中有很大一部分接口时从Node接口继承过来的,例如:Element,Attr,CDATASection等接口,都是从Node继承过来的,在DOM树中,Node接口代表了树中的一个节点。
2.所包含的主要方法:
1.appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去,
2.getFirstChild():如果节点存在子节点,则返回第一个子节点,同样,getLastChild():方法返回最后一个子节点。
3.getNextSibling();返回在DOM树中这个节点的下一个兄弟节点,同理,getPrevousSibling():返回该节点的前一个兄弟节点。
4.getNodeName():根据节点的类型返回节点的名称。
5.getNodeType():返回节点的类型。
3.NodeList接口
1.NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义,NodeList用于表示有顺序的关系的一组节点,比如某个节点的子节点序列,另外,还出现在一些方法的返回值中。
2.在DOM中,NodeList的对象是”live”的,也就是说,对文档的改变,会直接反映到相关的NodeList对象中。通过DOM的Element节点进行操作的时候(增删改查),这些改变或自动反映到NodeList对象中,而不需要DOM应用程序再做其他额外的操作。
3.NodeList中每个item都可以通过一个索引来访问,该索引从0开始。
4.NamedNodeMap
1.实现了NamedNodeMap接口,接口中的对象包含了可以通过名字来访问的一组节点的集合。
2.NamedNodeMap并不是从NodeList继承过来的。它所包含的节点集中的节点是无序的,尽管是通过索引阿里进行访问的。但是这只是提供了枚举NamedNodeMao中所包含节点的一种简单方法,并不表明在DOM规范中为NamedNodeMap中的节点规定了一种排序。
3.NamedNodeMap表示的是一组节点和其唯一名字的一一对应的关系,这个接口主要用在属性节点的表示上。
4.与NodeList相同,在DOM中,NamedNodeMap对象也是“live”的。
DOM基础
1.文档对象模型
2.通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象,通过存取这些对象就能存取XML文档的内容。
DOM深入解析
1.创建DOM解析工厂
1.DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance被调用的时候,它根据一个系统变量来决定具体使用哪一个解析器。
2.DOM的基本对象
1.一切都是节点(对象)
2.Node对象:DOM结构中最为基本的对象。
3.Document对象:代表整个XML的文档
4.NodeList对象:包含一个或者多个Node的列表
5.Element对象:代表XML文档中的标签元素。
当我们需要把这个文档的内容解析到一个个的java对象中去供程序使用,利用JAXP,我们只需要几行代码就能做到这一点。
首先,需要建立一个解析器工厂,利用该工厂获得一个具体的解析器对象。
建立代码:
//1获得DOM解析器的工厂(创建具体的解析器)-----使用简单工厂方法模式DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//2.获得具体的DOM解析器DocumentBuilder db = null;Document doc = null;try {db = dbf.newDocumentBuilder();//3.解析一个XML文档,获得Document对象(根节点)doc = db.parse(new File("xml/peoplexml.xml"));
1JAXP(java API for XML Parsing):用于XML解析的java API.
2.DocumentBuilderFactory与DocumentBuilder的关系
通过DocumentBuilderFactory工厂根据具体的平台环境返回相应的DocumentBuilder。
DOM的基本对象有5个:Document ,Node ,NodeList ,Element 和Attr
Document对象代表了整个XML的文档。所有其他的Node都以一定的顺序包含在Document对象内。排列成一个树形的结构。
Attr对象代表了某个标签中的属性,Attr继承于Node,但是因为Attr实际上是包含在Element中的,他并不能被看做是Element的子对象,因而在DOM中Attr并不是DOM树的一部分。所以Node中的getparentNode(),getPreviouseSibling()和getNextSibling()返回的都是讲null,
也就是说:Attr其实是被看做包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现,这一点要同其它的Node子对象相区别。
DOM中提供了很多操作XML的方法:
1.createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法放置在某一个Element对象上。
2.createElement(String) :用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个‘Element对象上添加属性或者进行其他擦做。
3.createTextNode(String ):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串,如果在一个标签内没有其他的标签,那么标签内的文本所代表的Text对象是这个Element对象唯一的子对象。
4.getElementsByTagName(String ):返回一个NodeList对象,它包含了所有给定标签名字的标签。
5.getDocumentElement():返回一个代表这个DOM树的根元素节点的Element对象,
也就是代表XML文档根元素的那个对象。
SAX解析XML文档
SAX(Simple APIs for XML),XML简单应用程序接口,与DOM不同,它提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式,当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现堆XML的访问,因而SAX接口也被称作事件驱动接口。
SAX提供的是一种顺序访问的机制,SAX分析器只做一笑而过简单的工作。大部分的工作还是由应用程序处理,SAX缺乏灵活性,但是实现效率较高,对内存的要求较低,对只进行访问而不进行修改的XML文档来说SAX更为合适。
创建SAX解析的方法:
实例代码2:
public class SAXTest2 {public static void main(String[] args) throws Exception{SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();parser.parse(new File("xml/student.xml"), new MyHandler2()); }
}
//继承过该方法后,所有的方法都是自己实现的,
class MyHandler2 extends DefaultHandler{//定义一个栈,存放解析的字符串private Stack<String> stack = new Stack<String>();private String name;private String gender;private String age;
// @Override
// public void startDocument() throws SAXException {
// super.startDocument();
// }
// @Override
// public void endDocument() throws SAXException {
// super.endDocument();
// }@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {stack.push(qName); //将标签名字压入栈中for(int i =0 ;i < attributes.getLength();i++ ){String attrName = attributes.getQName(i); //获得第i个属性的内容String attrValue = attributes.getValue(i); // 获得值System.out.println(attrName+" : "+attrValue);}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException { String tag = stack.peek(); //取出值if("姓名".equals(tag)){name = new String(ch,start ,length); //使用方法参数提取}else if("性别".equals(tag)){gender = new String(ch,start,length);}else if("年龄".equals(tag)){age = new String(ch,start,length);}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {stack.pop(); //表示该元素已经解析完毕,需要弹栈if("学生".equals(qName)){System.out.println("姓名:"+name);System.out.println("性别:"+gender);System.out.println("年龄: "+age);}System.out.println("--------------------");}
}
说明:
1.SAX:面向XML的简单APIs;
2.使用DOM解析XML时,首先将XML文档加载到内存中,然后通过随机的方式
访问内存中的DOM树,SAX是基于事件而且是顺序执行的。一旦经过某个元素就没有方法再去访问它了,SAX不必事先将整个XML文档加载到内存,占据内存比DOM小,对于大型的XML文档来说通常会使用SAX而不是DOM进行解析。
3.SAX使用观察者模式解析事件监听。
4.使用方法链的编程模式,更加清晰
SAX基础:
1.SAX是事件驱动的,文档的读入过程就是SAX的解析过程。
2.在读入的过程中,遇到不同的项目解析器会调用不同的方法
3.常用的事件处理方法:
1.org.xml.sax.helpers.DefaultHandler
项目 |
处理方法 |
文档开始 |
startDocument() |
<PEOPLE> |
startElement() |
“zhangsan ” |
Characters() |
<PEOPLE> |
endElement() |
文档结束 |
endDocument() |
New Ro�'�0txos��表XML文档根元素的那个对象。
SAX解析XML文档
SAX(Simple APIs for XML),XML简单应用程序接口,与DOM不同,它提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式,当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现堆XML的访问,因而SAX接口也被称作事件驱动接口。
SAX提供的是一种顺序访问的机制,SAX分析器只做一笑而过简单的工作。大部分的工作还是由应用程序处理,SAX缺乏灵活性,但是实现效率较高,对内存的要求较低,对只进行访问而不进行修改的XML文档来说SAX更为合适。
创建SAX解析的方法:
实例代码2:
使用DOM,SAX解析XML文档相关推荐
- Java 使用SAX解析XML文档
DOM,即Document Object Model,中文叫文档对象模型.DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的.用于内存存储和操作层次化文档的模型.当按 照DOM模型 ...
- JAVA SAX解析XML文档
SAX SAX(simple API for XML)是一种XML解析的方法,相比于DOM,SAX的解析更有效更快. 解析步骤 ①获取解析工厂 ②从解析工厂获取解析容器 ③编写处理器 ④加载Docum ...
- SAX解析XML文档——(二)
SAX从上向下解析,一行一行解析.节省内存,不适合CRUD. XML文档: <?xml version="1.0" encoding="UTF-8"?&g ...
- cocos2d-x 3.0 使用Sax解析xml文档(解决中文显示问题)
今天是个好日子,心想的事儿都能成,明天是个好日子,打开了家门儿迎春风... 恩,听着歌写文档生活就是这么享受. 今天以前的邻居大神突然在qq上赞了我一下,这让我异常激动啊..这还要从前前前几天说起,那 ...
- xml教程之java解析xml文档
1.java解析xml文件介绍 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX: ...
- 大杂烩 -- 四种生成和解析XML文档的方法详解
基础大杂烩 -- 目录 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包 ...
- Dom4j 解析Xml文档及 XPath查询 学习笔记
2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法: 1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题 2.快捷"查找" ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- libxml -- 解析 XML 文档
参考 http://xmlsoft.org/ http://www.miidoo.cn/info_detail-204.html http://www.blogjava.net/wxb_nudt/ar ...
- JAVA中利用DOM解析XML文档
JAVA中利用DOM解析XML文档 package org.sws.utils; import java.io.File;import java.io.IOException; import java ...
最新文章
- ArcGIS百米网格自动生成
- 改造消费方解决地址硬编码问题
- Html5 postMessage
- C++ STL中的Hashmap
- raspberry pi_如何使用Raspberry Pi构建数字针Kong相机
- android关于16进制转字符串的问题
- C语言运算符与输入输出
- 微信小程序项目实例——印记
- 【笔记】MySQL 根据出生日期计算当前年龄
- php多域名跳转,旱的旱死,涝的涝死,中超联赛的怪事
- Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
- spring boot整合RabbitMQ —— 十分钟急速上手
- 典型相关分析、对应分析
- 【面试】面试的时候,如何自我介绍?
- Windows VScode Linter pylint is not installed
- 怎么下载网页上的视频m3u4
- 今日分享 不可思议的人体
- 马克鳗标记及文字图片工具安装步骤mac版本
- 对搜索引擎不友好的网站具有怎样的特点呢
- matlab 自适应噪声对消,自适应噪声对消