1. XML使用SAX方式解析
SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
优点:消耗资源比较少;适合大文件解析;
缺点:只能读取不能修改;开发复杂;
1.1 使用SAX方式读取XML文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name id="001" xx="哈哈">张三</name>
<sex>男</sex>
<age>20</age>
</student>
<student>
<name id="002">李四</name>
<sex>女</sex>
<age>21</age>
</student>
</students>
package com.andrew.xml;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAX01 extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
@Override
public void endDocument() throws SAXException {
System.out.print("\n 扫描文档结束");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("<");
System.out.print(qName);
if (attributes != null) {
for (int i = 0; i < attributes.getLength(); i++) {
System.out.print(" " + attributes.getQName(i) + "=\"" + attributes.getValue(i) + "\"");
}
}
System.out.print(">");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("</");
System.out.print(qName);
System.out.print(">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.print(new String(ch, start, length));
}
public static void main(String[] args) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("src/students.xml", new SAX01());
}
}
运行结果:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name id="001" xx="哈哈">张三</name>
<sex>男</sex>
<age>20</age>
</student>
<student>
<name id="002">李四</name>
<sex>女</sex>
<age>21</age>
</student>
</students>
扫描文档结束
1.2 使用SAX方式读取XML数据到Bean
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="001">
<name>张三</name>
<sex>男</sex>
<age>20</age>
</student>
<student id="002">
<name>李四</name>
<sex>女</sex>
<age>21</age>
</student>
</students>
package com.andrew.model;
public class Student {
private String id;
private String name;
private String sex;
private int age;
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
// getter and setter
}
package com.andrew.xml;
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.helpers.DefaultHandler;
import com.andrew.model.Student;
public class SAX02 extends DefaultHandler {
private List<Student> students = null;
private Student student = null;
private String preTag = null; // 标记上一个节点名称
@Override
public void startDocument() throws SAXException {
System.out.println("开始读取学生信息");
students = new ArrayList<Student>();
}
@Override
public void endDocument() throws SAXException {
System.out.println("学生信息读取完毕");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("student".equals(qName)) {
student = new Student();
student.setId(attributes.getValue(0));
}
preTag = qName;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("student".equals(qName)) {
students.add(student);
student = null;
}
preTag = null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (preTag != null) {
String content = new String(ch, start, length);
if ("name".equals(preTag)) {
student.setName(content);
} else if ("sex".equals(preTag)) {
student.setSex(content);
} else if ("age".equals(preTag)) {
student.setAge(Integer.parseInt(content));
}
}
}
public static void main(String[] args) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAX02 sax02 = new SAX02();
parser.parse("src/studentsSax.xml", sax02);
for (Student s : sax02.students) {
System.out.println(s);
}
}
}
运行结果:
开始读取学生信息
学生信息读取完毕
Student [id=001, name=张三, sex=男, age=20]
Student [id=002, name=李四, sex=女, age=21]
分享到:
相关推荐
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
java学习笔记——使用DOM解析XML和使用SAX解析XML
java从服务器读取xml文件并以SAX方式解析附带(服务器与解析源码)
Sax解析XML文件解
XML解析之SAX解析DEMO,之前在播控上有介绍,但是代码排版太乱了,这个就是Android4.0网络编程中的SAX解析例子。
XML通过SAX解析为JSON格式的文档 例子中的类稍微修改可以做做到公用
下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。下面的例子可能...
android 以SAX方式解析xml
XML文件解析器 支持dom解析和sax模式解析,c语言实现
Java SAX解析Xml Demo(详细注释)
使用SAX解析方式解析XML文件及输出数据。
使用java语言对XML文档进行解析的示例,包括DOM,SAX方式,并包括使用jdom和jom4j框架进行XML解析或生成XML文档
SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码
使用sax解析从网络上获取的xml文件
xml sax解析
sax解析XML方式的代码及特点,sax解析XML方式的代码及特点,sax解析XML方式的代码及特点,sax解析XML方式的代码及特点
Android XML解析之SAX解析 简单方便的解析方法
Android 创建与解析XML Sax方式
SAX解析xml,是一种比较高效的方式。相比于其他的解析方式,占用内存比较低。
Sax解析xml文件详细例子,解析复杂节点的xml,把内容显示到view中,例子简单完整,易用