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);
}
}
}
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);
}
}
}