使用DOM,SAX解析XML文档
2014-10-15 12:47
471 查看
使用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,我们只需要几行代码就能做到这一点。
首先,需要建立一个解析器工厂,利用该工厂获得一个具体的解析器对象。
建立代码:
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:
说明:
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
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:全称: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(); // } @Override public 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); } } @Override public 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); } } @Override public 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() |
SAX解析XML文档
SAX(Simple APIs for XML),XML简单应用程序接口,与DOM不同,它提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式,当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现堆XML的访问,因而SAX接口也被称作事件驱动接口。
SAX提供的是一种顺序访问的机制,SAX分析器只做一笑而过简单的工作。大部分的工作还是由应用程序处理,SAX缺乏灵活性,但是实现效率较高,对内存的要求较低,对只进行访问而不进行修改的XML文档来说SAX更为合适。
创建SAX解析的方法:
实例代码2:
相关文章推荐
- Android 使用Dom与SAX解析xml文档的方式
- android中使用SAX, DOM, 或者pull 来解析XML文档
- 使用SAX技术对XML文档进行解析范例
- 使用DOM技术来对XML文档进行解析范例
- 两种解析XML文档的方法---DOM和SAX
- 两种解析XML文档的方法---DOM和SAX
- 【原创】使用DOM解析XML文档示例(Java)
- 两种解析XML文档的方法---DOM和SAX
- JavaWeb 之 XML文档的DOM和SAX解析方式详解
- DOM方式解析XML文档(另2种方式为SAX,STAX),(第二种直接用sax方式用java类实现)
- Android网络下使用SAX解析XML文档
- java解析xml之一:使用SAX与DOM
- Java中使用DOM来解析xml文档
- 两种解析XML文档的方法-----DOM和SAX
- Android SAX,DOM,PULL解析XML文档
- SAX和DOM解析XML文档的区别
- 使用DOM技术来对XML文档进行解析范例
- 两种解析XML文档的方法---DOM和SAX
- 使用SAX技术对XML文档进行解析范例
- 使用SAX和dom4j解析XML文档