JAVA SAX解析XML文件
2014-07-02 11:56
357 查看
[代码] [Java]代码
view sourceprint?
001
package SAXparse;
002
003
004
import java.io.FileInputStream;
005
import java.lang.reflect.Array;
006
import java.lang.reflect.InvocationTargetException;
007
import java.lang.reflect.Method;
008
import java.text.ParseException;
009
import java.text.SimpleDateFormat;
010
import java.util.ArrayList;
011
import java.util.List;
012
013
import javax.sql.rowset.spi.XmlReader;
014
import javax.xml.parsers.ParserConfigurationException;
015
import javax.xml.parsers.SAXParser;
016
import javax.xml.parsers.SAXParserFactory;
017
018
import org.w3c.dom.Element;
019
import org.xml.sax.Attributes;
020
import org.xml.sax.InputSource;
021
import org.xml.sax.SAXException;
022
import org.xml.sax.XMLReader;
023
import org.xml.sax.helpers.DefaultHandler;
024
025
026
027
public class SaxParse {
028
029
public static void main(String[] args) throws Exception {
030
// TODO Auto-generated method stub
031
SAXParserFactory saxpf = SAXParserFactory.newInstance();
032
SAXParser saxp = saxpf.newSAXParser();
033
XMLReader reader = saxp.getXMLReader();
034
//这里不同于DOM解析式多了一个Handler 创建一个将要解析文件的Handler类继承 DefaultHandler
035
EmployeeHandler empHander = new EmployeeHandler();
036
reader.setContentHandler(empHander);
037
//set Handler
038
reader.parse(new InputSource(new FileInputStream("file/xml/employeelist.xml")));
039
//开始解析,SAX 开始解析的时候 就会自动调用 EmployeeHandler 中的方法 开始解析调用startDocument(),开始解析一个元素调用startElement()。
040
ArrayList<Employee> empList = empHander.getEmployeeList();
041
for(Employee emp:empList){
042
System.out.println(emp);
class EmployeeHandler extends DefaultHandler{
049
//EmployeeHandler 继承DefaultHandler 然后根据需要选择要重载的 方法
050http://www.huiyi8.com/moban/ 网页模板
// 这里我重载了 startDocument endDocument startElement endElement endElement characters
051
private ArrayList<Employee> employeeList = new ArrayList<Employee>();
052
//创建一个list 来保存解析出来的employee对象
053
@Override
054
public void startDocument() throws SAXException {
055
// TODO Auto-generated method stub
056
System.out.println("begin");
057
//开始解析 打印 begin
058
}
059
060
@Override
061
public void endDocument() throws SAXException {
062
// TODO Auto-generated method stub
063
System.out.println("end");
064
// 结束后打印end
065
}
066
067
private Employee emp =null;
068
private Class cls =null;
069
private String qName=null;
070
public void startElement(String uri, String localName, String qName,
071
Attributes attributes) throws SAXException {
072
// TODO Auto-generated method stub
073
this.qName =qName;
074
//在这里保存一下 元素的名称,在characters()有用到
075
try {
076
cls =Class.forName("SAXparse.Employee");
077
//反射机制
078
Method[] methods =cls.getMethods();
079
if(qName.equals("employee")||qName.equals("salary")){
080
//如果qName=employee 也就是解析到了 employee元素和salary 元素才继续
081
// 因为employee就是要建立的对象,每当解析到一个employee元素就创建一个employee对象
082
// salary 因为有属性所以也单独拿出来
083
if(emp==null){
084
//如果employee对象不存在 就创建
085
emp = (Employee) cls.newInstance();
086
System.out.println("创建一个emp对象");
087
}
088
for(Method me : methods){
089
String meName = me.getName();
090
if(meName.startsWith("set")){
091
String mName = meName.substring(3).toLowerCase();
092
Class[] parm = me.getParameterTypes();
093
String parma = parm[0].getName();
094
095
for(int i=0;i<attributes.getLength();i++){
096
String attrName = attributes.getQName(i);
097
//直接从函数参数中拿到attributes 这里也就是 SAX我感觉 比DOM 效率高的地方
098
//是顺序解析的。但是自由度就没有DOM解析高了
099
String attrVal = attributes.getValue(i);
100
if(mName.equals(attrName.toLowerCase())){
101
if(parma.equals("java.lang.String")){
102
//吧属性set进emp对象中
103
me.invoke(emp,attrVal );
view sourceprint?
001
package SAXparse;
002
003
004
import java.io.FileInputStream;
005
import java.lang.reflect.Array;
006
import java.lang.reflect.InvocationTargetException;
007
import java.lang.reflect.Method;
008
import java.text.ParseException;
009
import java.text.SimpleDateFormat;
010
import java.util.ArrayList;
011
import java.util.List;
012
013
import javax.sql.rowset.spi.XmlReader;
014
import javax.xml.parsers.ParserConfigurationException;
015
import javax.xml.parsers.SAXParser;
016
import javax.xml.parsers.SAXParserFactory;
017
018
import org.w3c.dom.Element;
019
import org.xml.sax.Attributes;
020
import org.xml.sax.InputSource;
021
import org.xml.sax.SAXException;
022
import org.xml.sax.XMLReader;
023
import org.xml.sax.helpers.DefaultHandler;
024
025
026
027
public class SaxParse {
028
029
public static void main(String[] args) throws Exception {
030
// TODO Auto-generated method stub
031
SAXParserFactory saxpf = SAXParserFactory.newInstance();
032
SAXParser saxp = saxpf.newSAXParser();
033
XMLReader reader = saxp.getXMLReader();
034
//这里不同于DOM解析式多了一个Handler 创建一个将要解析文件的Handler类继承 DefaultHandler
035
EmployeeHandler empHander = new EmployeeHandler();
036
reader.setContentHandler(empHander);
037
//set Handler
038
reader.parse(new InputSource(new FileInputStream("file/xml/employeelist.xml")));
039
//开始解析,SAX 开始解析的时候 就会自动调用 EmployeeHandler 中的方法 开始解析调用startDocument(),开始解析一个元素调用startElement()。
040
ArrayList<Employee> empList = empHander.getEmployeeList();
041
for(Employee emp:empList){
042
System.out.println(emp);
class EmployeeHandler extends DefaultHandler{
049
//EmployeeHandler 继承DefaultHandler 然后根据需要选择要重载的 方法
050http://www.huiyi8.com/moban/ 网页模板
// 这里我重载了 startDocument endDocument startElement endElement endElement characters
051
private ArrayList<Employee> employeeList = new ArrayList<Employee>();
052
//创建一个list 来保存解析出来的employee对象
053
@Override
054
public void startDocument() throws SAXException {
055
// TODO Auto-generated method stub
056
System.out.println("begin");
057
//开始解析 打印 begin
058
}
059
060
@Override
061
public void endDocument() throws SAXException {
062
// TODO Auto-generated method stub
063
System.out.println("end");
064
// 结束后打印end
065
}
066
067
private Employee emp =null;
068
private Class cls =null;
069
private String qName=null;
070
public void startElement(String uri, String localName, String qName,
071
Attributes attributes) throws SAXException {
072
// TODO Auto-generated method stub
073
this.qName =qName;
074
//在这里保存一下 元素的名称,在characters()有用到
075
try {
076
cls =Class.forName("SAXparse.Employee");
077
//反射机制
078
Method[] methods =cls.getMethods();
079
if(qName.equals("employee")||qName.equals("salary")){
080
//如果qName=employee 也就是解析到了 employee元素和salary 元素才继续
081
// 因为employee就是要建立的对象,每当解析到一个employee元素就创建一个employee对象
082
// salary 因为有属性所以也单独拿出来
083
if(emp==null){
084
//如果employee对象不存在 就创建
085
emp = (Employee) cls.newInstance();
086
System.out.println("创建一个emp对象");
087
}
088
for(Method me : methods){
089
String meName = me.getName();
090
if(meName.startsWith("set")){
091
String mName = meName.substring(3).toLowerCase();
092
Class[] parm = me.getParameterTypes();
093
String parma = parm[0].getName();
094
095
for(int i=0;i<attributes.getLength();i++){
096
String attrName = attributes.getQName(i);
097
//直接从函数参数中拿到attributes 这里也就是 SAX我感觉 比DOM 效率高的地方
098
//是顺序解析的。但是自由度就没有DOM解析高了
099
String attrVal = attributes.getValue(i);
100
if(mName.equals(attrName.toLowerCase())){
101
if(parma.equals("java.lang.String")){
102
//吧属性set进emp对象中
103
me.invoke(emp,attrVal );
相关文章推荐
- SAX 解析XML文件:将XML转换成Java对象
- JAVA SAX 方式解析XML文件
- java中用SAX方式解析xml文件
- Java基础系列17:使用DOM、SAX、JDOM、DOM4J解析XML文件详解
- 不依赖第三方jar包的通过java sax解析本地xml文件的实例代码
- Java解析XML文件的DOM和SAX方式
- java的xml学习[使用SAX解析XML文件]
- Java&Xml教程(五)使用SAX方式解析XML文件
- 【Java编程】SAX XML Parser解析、生成XML文件
- Java之xml文件解析二(SAX方式解析xml文件)
- Java Sax解析xml文件
- 黑马程序员——java解析XML文件(SAX解析 和 DOM解析)
- 【Java编程】SAX XML Parser解析、生成XML文件
- java 解析XML文件(DOM & SAX)(一)
- Java 使用SAX解析xml文件
- Java乔晓松-使用SAX,DOM,pull解析XML文件以及pull解析生成xml文件
- java解析xml文件的2种方法:sax,dom
- Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】
- JAVA解析XML文件--SAX方式
- Java&Xml教程(五)使用SAX方式解析XML文件