XML文档解析:SAX解析

xiaoxiao2025-11-01  4

一,SAX的概述      

       SAX(XML的简单API)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM ,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。

SAX的优点:

解析速度快占用内存少

SAX的缺点:

无法知道当前解析标签(节点)的上层标签,及其嵌套结构,仅仅知道当前解析的标签的名字和属性,要知道其他信息需要程序猿自己编码只能读取XML,无法修改XML无法随机访问某个标签(节点)SAX解析适用场合  对于CPU资源宝贵的设备,如安卓等移动设备对于只需从XML读取信息而无需修改XML

二,SAX解析的步骤

解析步骤可分为五步:

           1,获得sax解析工厂                SAXParserFactory factory = SAXParserFactory.newInstance();

           2,解析工厂生产sax解析器                SAXParser saxParser = factory.newSAXParser();

           3,根据解析工厂创建读取器                XMLReader xmlReader = saxParser.getXMLReader();

           4,根据读取器设置事件处理器                xmlReader.setContentHandler(new MyHandler());

        setContentHandler方法中的参数是ContentHandler的类型的是一个接口,由于接口不能直接新的对象,使用匿名内部类的办法代码过于冗长,想到使用其实现的子类的DefaultHandler需要实现的方法太多,从事我们应该想到适配器的概念。于是自己创建一个MyHandler类并扩展DefaultHandler覆盖部分方法           .5,解析books.xml文件                xmlReader.parse(“xml / books.xml”);

三,实现代码

(一)

Books.xml的代码:

 

 

自定义SAX解析器:

 

public class MyHandler extends DefaultHandler { private List<Bookorder> bookOrderList; Bookorder bookOrder; String text; @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("books.xml文档开始解析..."); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("books.xml文档解析结束..."); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); System.out.print("<" + qName); //解析属性 for (int i = 0; i < attributes.getLength(); i++) { System.out.print(" " + attributes.getLocalName(i) + "=\""+ attributes.getValue(i) + "\""); } System.out.print(">"); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); System.out.print("</" + qName + ">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); //打印标签中的内容,按格式输出 System.out.print(new String(ch, start, length)); } }

测试解析XML文件:

//1、获得sax解析工厂         SAXParserFactory factory = SAXParserFactory.newInstance();         //2、解析工厂生产sax解析器         SAXParser saxParser = factory.newSAXParser();         //3、根据解析工厂创建读取器         XMLReader xmlReader = saxParser.getXMLReader();         //4、根据读取器设置事件处理器         xmlReader.setContentHandler(new MyHandler2());         //5、解析books.xml文件         xmlReader.parse("xml/books.xml");

 

解析结果:

 


(二)解析XML文档并将其封装在JavaBean的对象中

的books.xml文档:

编写JavaBean的代码

Bookorder1对象

package saxBean; public class Bookorder1 { private String id; private String name; private String author; private String price; public String getPrice() { return price; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setPrice(String price) { this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { return "Bookorder1 [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + "]"; } }

自定义解析器:

package com.syj.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 saxBean.Bookorder1; public class MyHandler1 extends DefaultHandler { private List<Bookorder1> bookOrderList; private Bookorder1 bookOrder; private String text; @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("books.xml文档开始解析..."); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); for (Bookorder1 bookorder1 : bookOrderList) { System.out.println(bookorder1); } System.out.println("books.xml文档解析结束"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); if ("books".equals(qName)) { bookOrderList = new ArrayList<Bookorder1>(); } else if ("book".equals(qName)) { bookOrder = new Bookorder1(); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if ("id".equals(qName)) { bookOrder.setId(text); } else if ("name".equals(qName)) { bookOrder.setName(text); } else if ("author".equals(qName)) { bookOrder.setAuthor(text); } else if ("price".equals(qName)) { bookOrder.setPrice(text); } else if ("book".equals(qName)) { bookOrderList.add(bookOrder); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); // 打印标签中的内容,按格式输出 text = new String(ch, start, length); } }

测试代码:

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //1、获得sax解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //2、解析工厂生产sax解析器 SAXParser saxParser = factory.newSAXParser(); //3、解析books.xml文件 saxParser.parse("xml/books.xml", new MyHandler1()); }

结果展示:

 

 

 

 

 

 

 

 

 

          

转载请注明原文地址: https://www.6miu.com/read-5038854.html

最新回复(0)