java sax解析xml报文_java中用SAX方式解析xml文件

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准。SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强。使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器。SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并根据文档的内容产生事件。而事件处理器则是org.xml.sax包中的ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口,它们分别处理事件源在解析XML文档过程中产生的不同种类的事件。在开发中没有必要直接从这4个接口直接继承,因为org.xml.sax.helper包提供了类DefaultHandler,其继承了这4个接口,在实际开发中直接从DefaultHandler继承并实现相关函数就可以了。

如果定制,则还需要重写这几个方法。

1.开始解析

public void startDocument()

2.结束解析

public void endDocument()

3.遇到元素

public void startElement(String namespaceURI, String localName,

String qName, Attributes atts)

4.遇到元素

public void endElement(String namespaceURI, String localName, String qName)

5. 与 之间

public void characters(char ch[], int start, int length)

下面是该项目在eclipse中的目录结构:

a2dc78eff588b17eb42c83ac3e64fab5.png

一、首先创建books.xml文件

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

2

3

4 冰与火之歌

5 乔治马丁

6 2014

7 89

8

9

10 安徒生童话

11 2004

12 77

13 English

14

15

二、创建实体类Book.java

1 packagecom.imooc.entity;2

3 public classBook {4 privateString id;5 privateString name;6 privateString author;7 privateString year;8 privateString price;9 privateString language;10 publicString getId() {11 returnid;12 }13 public voidsetId(String id) {14 this.id =id;15 }16 publicString getName() {17 returnname;18 }19 public voidsetName(String name) {20 this.name =name;21 }22 publicString getAuthor() {23 returnauthor;24 }25 public voidsetAuthor(String author) {26 this.author =author;27 }28 publicString getYear() {29 returnyear;30 }31 public voidsetYear(String year) {32 this.year =year;33 }34 publicString getPrice() {35 returnprice;36 }37 public voidsetPrice(String price) {38 this.price =price;39 }40 publicString getLanguage() {41 returnlanguage;42 }43 public voidsetLanguage(String language) {44 this.language =language;45 }46

47

48 }

三、创建SAXParserHandler .java类

packagecom.imooc.handler;importjava.util.ArrayList;importorg.xml.sax.Attributes;importorg.xml.sax.SAXException;importorg.xml.sax.helpers.DefaultHandler;importcom.imooc.entity.Book;public class SAXParserHandler extendsDefaultHandler {

String value= null;

Book book= null;private ArrayList bookList = new ArrayList();public ArrayListgetBookList() {returnbookList;

}int bookIndex = 0;/*** 用来标识解析开始*/@Overridepublic void startDocument() throwsSAXException {//TODO Auto-generated method stub

super.startDocument();

System.out.println("SAX解析开始");

}/*** 用来标识解析结束*/@Overridepublic void endDocument() throwsSAXException {//TODO Auto-generated method stub

super.endDocument();

System.out.println("SAX解析结束");

}/*** 解析xml元素*/@Overridepublic voidstartElement(String uri, String localName, String qName,

Attributes attributes)throwsSAXException {//调用DefaultHandler类的startElement方法

super.startElement(uri, localName, qName, attributes);if (qName.equals("book")) {

bookIndex++;//创建一个book对象

book = newBook();//开始解析book元素的属性

System.out.println("======================开始遍历某一本书的内容=================");// //已知book元素下属性的名称,根据属性名称获取属性值//String value = attributes.getValue("id");//System.out.println("book的属性值是:" + value);//不知道book元素下属性的名称以及个数,如何获取属性名以及属性值

int num =attributes.getLength();for(int i = 0; i < num; i++){

System.out.print("book元素的第" + (i + 1) + "个属性名是:"

+attributes.getQName(i));

System.out.println("---属性值是:" +attributes.getValue(i));if (attributes.getQName(i).equals("id")) {

book.setId(attributes.getValue(i));

}

}

}else if (!qName.equals("name") && !qName.equals("bookstore")) {

System.out.print("节点名是:" + qName + "---");

}

}

@Overridepublic voidendElement(String uri, String localName, String qName)throwsSAXException {//调用DefaultHandler类的endElement方法

super.endElement(uri, localName, qName);//判断是否针对一本书已经遍历结束

if (qName.equals("book")) {

bookList.add(book);

book= null;

System.out.println("======================结束遍历某一本书的内容=================");

}else if (qName.equals("name")) {

book.setName(value);

}else if (qName.equals("author")) {

book.setAuthor(value);

}else if (qName.equals("year")) {

book.setYear(value);

}else if (qName.equals("price")) {

book.setPrice(value);

}else if (qName.equals("language")) {

book.setLanguage(value);

}

}

@Overridepublic void characters(char[] ch, int start, intlength)throwsSAXException {//TODO Auto-generated method stub

super.characters(ch, start, length);

value= newString(ch, start, length);if (!value.trim().equals("")) {

System.out.println("节点值是:" +value);

}

}

}

四、测试方法

SAXTest.java

方法

packagecom.imooc.test;importjava.io.IOException;importjavax.xml.parsers.ParserConfigurationException;importjavax.xml.parsers.SAXParser;importjavax.xml.parsers.SAXParserFactory;importorg.xml.sax.SAXException;importorg.xml.sax.SAXParseException;importcom.imooc.entity.Book;importcom.imooc.handler.SAXParserHandler;public classSAXTest {/***@paramargs*/

public static voidmain(String[] args) {

SAXParserFactory factory =SAXParserFactory.newInstance();

try{

SAXParser parser=factory.newSAXParser();

SAXParserHandler handler = newSAXParserHandler();

parser.parse("books.xml", handler);

System.out.println("~!~!~!共有" +handler.getBookList().size()+ "本书");for(Book book : handler.getBookList()) {

System.out.println(book.getId());

System.out.println(book.getName());

System.out.println(book.getAuthor());

System.out.println(book.getYear());

System.out.println(book.getPrice());

System.out.println(book.getLanguage());

System.out.println("----finish----");

}

}catch(ParserConfigurationException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(SAXException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值