xml解析技术-jaxp-sax解析

TestSax类:

package day06_parser.sax;
/**
 * xml的解析技术:JAXP是Java API for XML Processing的英文字头缩写,
 * 中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。
 * 下面我们研究两种解析方式:
 * 1.dom解析	2.sax解析:Simple API for XML
 * 下面是dom解析的实例。
 * JAXP-DOM解析实例:
 * 下面的实例实现的功能是,通过javax.xml包实现sax方式的xml的解析
 * 具体的操作有增加节点,删除节点,修改节点内容,查询节点信息
 */
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import day06_parser.domain.Book;

public class TestSax {
	/*
	xml的第二种解析方式:sax:simple api for xml
  	1.SAX 是事件驱动的 XML 处理方法
	2.逐行扫描文档,一边扫描一边解析
	3.SAX来说就是操作复杂
	4.仅需实现部分接口时扩展org.xml.sax.helpers.DefaultHandler类
	5.DefaultHandler类默认的空实现 

	 */

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		demo1();
	}
	public static void demo1() throws Exception{
		//1.工厂
		SAXParserFactory factory=SAXParserFactory.newInstance();
		//2.解析器
		SAXParser parser=factory.newSAXParser();
		//解析xml
		//定义默认的defaultHander类,处理的方法
		MyDefaultHandler dh=new MyDefaultHandler();
		parser.parse(new File("db.xml"), dh);
		List<Book> allBookList = dh.getData(); //获得所有的书籍(JavaBean)数据
		for (Book book : allBookList) {
			System.out.println(book);
		}

		//###############################3
		//存放方式1: 一个map存放一本书
		Map<String, String> data = new HashMap<String,String>();
		data.put("id", "b001");
		data.put("title", "xxxx");
		data.put("price", "100");

		//方式2:面向对象,用于封装数据对象,JavaBean
		Book book = new Book();
		book.setId("b001");
		book.setTitle("java web");
	}

}

sax解析的核心类:MyDefaultHander类

package day06_parser.sax;
//这个类就是sax解析的核心类。
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import day06_parser.domain.Book;

public class MyDefaultHandler extends DefaultHandler {
	//1用于缓存处理数据
	private List<Book> data;
	// 4 用于缓存当前的标签名称(元素名称)
	private String elementName;
	//以上的这些数据在dom方式里面存储在document对象里面了。
	@Override
	public void startDocument() throws SAXException {
		//2对容器进行初始化
		data = new ArrayList<Book>();
	}

	/**
	 * * xml没有约束
	 * 		uri # null
	 *      localname#null
	 *      qName # 元素名称
	 * * xml 约束
	 * 		uri # 命名空间值  targatNamespace="xxxxx"
	 *      localname # 元素名称 <table>
	 *      qName # 前缀:名称  <my:table>
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if("book".equals(qName)){
			// 3.1 说明解析到了一个新书
			Book book = new Book();
			// 3.2 添加到list中
			data.add(book);
			// 3.3 缓存id属性
			book.setId(attributes.getValue("id"));
		}
		this.elementName = qName;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String value = new String(ch, start, length);
		if("title".equals(elementName)){
			//value 表示title的数据
			data.get(data.size() - 1).setTitle(value);
		}
		if("price".equals(elementName)){
			//value 表示title的数据
			data.get(data.size() - 1).setPrice(value);
		}
		if("author".equals(elementName)){
			//value 表示title的数据
			data.get(data.size() - 1).setAuthor(value);
		}
		//使用过后清空缓存
		this.elementName = null;
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println("元素结束");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("文档结束");
	}

	/**
	 * 用于返回处理过的所有数据
	 * @return
	 */
	public List<Book> getData() {
		return data;
	}
}

另外还用到了两个类:

book类-javebean:

package day06_parser.domain;
/**
 * 普通的类,她就是javabean
 * 	* 提供相应的私有字段,封装数据
 *  * 提供字段的相应的getter或setter方法
 * @author hym
 *
 */
public class Book {
	private String id;
	private String title;
	private String price;
	private String author;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	@Override
	public String toString() {
		return "Book [id=" + id + ", title=" + title + ", price=" + price
				+ ", author=" + author + "]";
	}
}

需要解析的xml文件:

db.xml

<?xml version="1.0" encoding="UTF-8"?>

<books>
  <book id="b001">
    <title>android</title>
    <price>28</price>
    <author>胡爷</author>
  </book>
  <book id="b002">修改了节点的文本内容
    <title>修改了节点的文本内容</title>修改了节点的文本内容
    <price>修改了节点的文本内容</price>修改了节点的文本内容
    <author>修改了节点的文本内容</author>修改了节点的文本内容
  </book>
</books>

xml解析技术-jaxp-sax解析

时间: 2024-10-07 23:44:37

xml解析技术-jaxp-sax解析的相关文章

Java学习之Xml系列五:SAX解析——搜索xml内容

本文对SAX解析进一步说明. 另外主要给利用SAX解析方法找到指定条件(如标签名称)的xml文档内容. 首先按需要介绍一下DefaultHandler. DefaultHandler类是SAX2事件处理程序的默认基类.它继承了EntityResolver.DTDHandler.ContentHandler和ErrorHandler这四个接口.包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法.(注意:ContentHandler

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

一:JAXP使用SAX方式解析XML文件 1:dom解析与sax解析异同点 2:sax解析特点 二:代码案例 1:xml文件 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <students> 3 <student> 4 <name sid="111">李四</name> 5 <age>

XML技术之SAX解析器

1.解析XML文件有三种解析方法:DOM SAX DOM4J. 2.首先SAX解析技术只能读取XML文档中的数据信息,不能对其文档中的数据进行添加,删除,修改操作:这就是SAX解析技术的一个缺陷. 3.SAX解析器中可以定义多个事件处理器对象. SAX解析技术原理图: //使用SAX技术解析XML文件的步骤?    public static void saxXml() throws Exception{        //第一步:调用SAXParserFactory.newInstance()

2018/1/1 XML和DOM、SAX解析

1.XML (1)描述带关系的数据(软件的配置文件) (2)数据的载体(小型的"数据库")2.语法:标签: 标签名不能以数字开头,中间不能有空格,区分大小写.有且仅有一个根标签.属性: 可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单双混用.文档声明: <?xml version="1.0" encoding="utf-8"?> encoding="utf-8": 打开或解析xml文档时

Android笔记(四十七) Android中的数据存储——XML(三)SAX解析

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用这

iOS开发中XML的DOM和SAX解析方法

一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文件.xml文件很大时,建立的“树”也会大,所以会大量占用内存. sax解析器核心是事件处理机制.例如解析器发现一个标记的开始标记时,将所发现的数据会封装为一个标记开始事件,并把这个报告给事件处理器,事件处理器再调用方法(startElement)处理发现的数据.下面我们尝试一下SAX和DOM解析:

XML文档的SAX解析

xml文件: <?xml version="1.0" encoding="UTF-8"?> <books> <!--根节点--><!--这里的空白也算一个节点,所以books共有5个子节点--> <book id="book1" w="wwwww"> <name><a>AAAAAA</a>bookName1</name>

XML解析之SAX解析技术案例

Java代码: package com.xushouwei.xml; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import java

XML 解析---dom解析和sax解析

目前XML解析的方法主要用两种: 1.dom解析:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML文档加载到内存中,生成该XML文档对应的document对象,然后把XML文档中的各个标签元素变成相应的Element对象,文本会变成Text对象,属性会变成Attribute对象,并按这些标签.文本.属性在XML文档中的关系保存这些对象的关系. 缺点:消耗内存,所以使用dom解析XML文档时不能解

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)