您的位置:首页 > 其它

利用JAXP开发包进行SAX方式进行解析

2015-09-03 17:05 260 查看
JAXP进行SAX解析

SAX解析原理:

DOM方式必须将XML的DOM树全部加载到内存才能开始读取,若文档过大,易造成内存溢出

通过读取器读取XML文档,当读到了文档的某一部分时(文档的开始,元素的开始、文本、元素的结束、文档的结束),

都会调用事件处理器的对应方法,读到的数据,以参数的形式传递给对应的方法。

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

<书架>

<书>

<书名>JAVA</书名>

<作者>毕向东</作者>

<售价>38</售价>

</书>

<书>

<书名>JAVAWEB</书名>

<作者>马士兵</作者>

<售价>80</售价>

</书>

</书架>

// 例1: JAXP进行SAX解析原理示例 :

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.ContentHandler;

import org.xml.sax.Locator;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

// JAXP进行SAX解析原理示例

public class SAXDemo1 {

public static void main(String[] args) throws Exception {

// 得到解析工厂SAXParserFactory

SAXParserFactory factory = SAXParserFactory.newInstance();

// 得到解析器SAXParser

SAXParser parser = factory.newSAXParser();

// 得到XML读取器: XMLReader

XMLReader reader = parser.getXMLReader();

// 注册内容/事件处理器: ContentHandler

reader.setContentHandler(new MyContentHandler());

// 读取XML文档

reader.parse("src/book.xml");

}

}

class MyContentHandler implements ContentHandler {

// 解析到文档开始时被调用

@Override

public void startDocument() throws SAXException {

System.out.println("解析到了文档的开始");

}

// 解析到元素开始时被调用 qName:元素名称

@Override

public void startElement(String uri, String localName, String qName,

Attributes atts) throws SAXException {

System.out.println("解析到了元素的开始:" + qName);

}

// 解析到文本内容时被调用 注: 空格换行不能被忽略

@Override

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

System.out.println("文本内容:" + new String(ch,start,length));

}

// 解析到元素结束时被调用

@Override

public void endElement(String uri, String localName, String qName) throws SAXException {

System.out.println("解析到了元素的结束:" + qName);

}

// 解析到文档结束时被调用

@Override

public void endDocument() throws SAXException {

System.out.println("解析到了文档的结束");

}

@Override

public void endPrefixMapping(String prefix) throws SAXException { }

@Override

public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { }

@Override

public void processingInstruction(String target, String data) throws SAXException { }

@Override

public void setDocumentLocator(Locator locator) { }

@Override

public void skippedEntity(String name) throws SAXException { }

@Override

public void startPrefixMapping(String prefix, String uri) throws SAXException { }

}

*************************************************************************************************************

// 例2: 打印出第2本书的作者

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.ContentHandler;

import org.xml.sax.Locator;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

public class SAXDemo2 {

public static void main(String[] args) throws Exception {

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

XMLReader reader = parser.getXMLReader();

reader.setContentHandler(new ContentHandler() {

// 是作者: 第2个作者

boolean isAuthor = false; // 是不是作者标签

int index = 0; // 作者标签的索引

@Override

public void startElement(String uri, String localName, String qName, Attributes atts)
throws SAXException {

if("作者".equals(qName))

isAuthor = true;

}

@Override

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

if(isAuthor && index==1){

System.out.println(new String(ch,start,length));

}

}

@Override

public void endElement(String uri, String localName, String qName) throws SAXException {

if("作者".equals(qName)){

index++;

}

isAuthor = false;

}

@Override

public void endDocument() throws SAXException { }

@Override

public void endPrefixMapping(String prefix) throws SAXException { }

@Override

public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { }

@Override

public void processingInstruction(String target, String data) throws SAXException { }

@Override

public void setDocumentLocator(Locator locator) { }

@Override

public void skippedEntity(String name) throws SAXException { }

@Override

public void startDocument() throws SAXException { }

@Override

public void startPrefixMapping(String prefix, String uri) throws SAXException {}

});

reader.parse("src/book.xml");

}

}

*************************************************************************************************************

// 例3: 解析XML中的内容,封装到javaBean中

先创建一个book的bean类,包含三个字符串类型的字段: name author price,设置setter、getter方法,和
tostring方法

开始解析:

import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.DefaultHandler;

import cn.itcast.domain.Book;

public class SAXDemo3 {

public static void main(String[] args) throws Exception {

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

XMLReader reader = parser.getXMLReader();

final List books = new ArrayList(); // 存放所有的书

reader.setContentHandler(new DefaultHandler() {

Book book = null;

String currentTagName = null;

@Override

public void startElement(String uri, String localName,

String qName, Attributes attributes) throws SAXException {

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

book = new Book();

}

currentTagName = qName;

}

@Override

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

if("书名".equals(currentTagName)){

book.setName(new String(ch,start,length));

}

if("作者".equals(currentTagName)){

book.setAuthor(new String(ch,start,length));

}

if("售价".equals(currentTagName)){

book.setPrice(Integer.parseInt(new String(ch,start,length)));

}

}

@Override

public void endElement(String uri, String localName, String qName) throws SAXException
{

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

books.add(book);

book = null;

}

currentTagName = null;

}

});

reader.parse("src/book.xml");

// 验证代码

for(Object b : books){

System.out.println(b);

}

}

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