使用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文档相关推荐

  1. Java 使用SAX解析XML文档

    DOM,即Document Object Model,中文叫文档对象模型.DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的.用于内存存储和操作层次化文档的模型.当按 照DOM模型 ...

  2. JAVA SAX解析XML文档

    SAX SAX(simple API for XML)是一种XML解析的方法,相比于DOM,SAX的解析更有效更快. 解析步骤 ①获取解析工厂 ②从解析工厂获取解析容器 ③编写处理器 ④加载Docum ...

  3. SAX解析XML文档——(二)

    SAX从上向下解析,一行一行解析.节省内存,不适合CRUD. XML文档: <?xml version="1.0" encoding="UTF-8"?&g ...

  4. cocos2d-x 3.0 使用Sax解析xml文档(解决中文显示问题)

    今天是个好日子,心想的事儿都能成,明天是个好日子,打开了家门儿迎春风... 恩,听着歌写文档生活就是这么享受. 今天以前的邻居大神突然在qq上赞了我一下,这让我异常激动啊..这还要从前前前几天说起,那 ...

  5. xml教程之java解析xml文档

    1.java解析xml文件介绍 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX: ...

  6. 大杂烩 -- 四种生成和解析XML文档的方法详解

    基础大杂烩 -- 目录 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包 ...

  7. Dom4j 解析Xml文档及 XPath查询 学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

  8. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  9. libxml -- 解析 XML 文档

    参考 http://xmlsoft.org/ http://www.miidoo.cn/info_detail-204.html http://www.blogjava.net/wxb_nudt/ar ...

  10. JAVA中利用DOM解析XML文档

    JAVA中利用DOM解析XML文档 package org.sws.utils; import java.io.File;import java.io.IOException; import java ...

最新文章

  1. ArcGIS百米网格自动生成
  2. 改造消费方解决地址硬编码问题
  3. Html5 postMessage
  4. C++ STL中的Hashmap
  5. raspberry pi_如何使用Raspberry Pi构建数字针Kong相机
  6. android关于16进制转字符串的问题
  7. C语言运算符与输入输出
  8. 微信小程序项目实例——印记
  9. 【笔记】MySQL 根据出生日期计算当前年龄
  10. php多域名跳转,旱的旱死,涝的涝死,中超联赛的怪事
  11. Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
  12. spring boot整合RabbitMQ —— 十分钟急速上手
  13. 典型相关分析、对应分析
  14. 【面试】面试的时候,如何自我介绍?
  15. Windows VScode Linter pylint is not installed
  16. 怎么下载网页上的视频m3u4
  17. 今日分享 不可思议的人体
  18. 马克鳗标记及文字图片工具安装步骤mac版本
  19. 对搜索引擎不友好的网站具有怎样的特点呢
  20. matlab 自适应噪声对消,自适应噪声对消

热门文章

  1. iOS客户端安装包大小优化
  2. 怎么在桌面添加windows便签记事本
  3. iOS性能优化的几个方向
  4. 利用bat文件批量修改文件后缀名
  5. quartz定时任务xml配置
  6. 软件测试的分类(按是否查看代码划分)
  7. USB3.0接口定义浅析
  8. Matlab中的数据类型
  9. 嵌入式软件设计(1)--概述
  10. 数学建模系列-预测模型(五)---马尔可夫链