您的位置:首页 > 其它

使用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,我们只需要几行代码就能做到这一点。

首先,需要建立一个解析器工厂,利用该工厂获得一个具体的解析器对象。

建立代码:
//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()

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:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: