Java SAX解析

Posted ssxblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java SAX解析相关的知识,希望对你有一定的参考价值。

sax解析 一行一行的解析,针对数据量较大的
dom解析 将整个数据加载,针对数据较小的
 
 sax步骤
1、获得解析工厂 SAXParserFactory
2、工厂获取解析器 SAXParser
3、加载文档Document注册处理器

 

1、首先写一个xml    

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person>
        <name>至尊宝</name>
        <age>90000</age>
    </person>
    <person>
        <name>紫霞</name>
        <age>10000</age>
    </person>
</persons>

2、Persond类(准备)

Persond.java

package xml;
/*
 * sax解析 一行一行的解析,针对数据量较大的
 * dom解析 将整个数据加载,针对数据较小的
 * 
 * sax步骤
 * 1、获得解析工厂 SAXParserFactory
 * 2、工厂获取解析器 SAXParser
 * 3、加载文档Document注册处理器
 */
public class Persond 
    private String name;
    private int age;
    
    public Persond() 
        
    
    public Persond(String name, int age) 
        super();
        this.name = name;
        this.age = age;
    
    
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public int getAge() 
        return age;
    
    public void setAge(int age) 
        this.age = age;
    

3、注册处理器(存储对象)

PersonHandler.java

package xml;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/*
 * 存储对象
 */
public class PersonHandler extends DefaultHandler 
    private List<Persond> persons;
    private Persond person;
    private String tag;  //记录标签名

    @Override
    public void startDocument() throws SAXException 
//        System.out.println("处理文档开始");
        persons=new ArrayList<Persond>();
    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 
        // TODO Auto-generated method stub
        System.out.println("开始一个元素"+qName);
        if(null!=qName) 
            tag=qName;
        
        if(null!=qName&&qName.equals("person")) 
            person=new Persond();
        
    
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException 
        String str=new String(ch,start,length);
        if(null!=tag&&tag.equals("name")) 
//            System.out.println(new String(ch,start,length));
            //存数据
            person.setName(str);
            
        else if(null!=tag&&tag.equals("age")) 
            Integer age=Integer.valueOf(str);
            person.setAge(age);
        
        
    
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException 
//        System.out.println("结束一个元素"+qName);
        if(qName.equals("person")) 
            this.persons.add(person);
        
        tag=null;
    


    @Override
    public void endDocument() throws SAXException 
        // TODO Auto-generated method stub
        System.out.println("文档处理结束");
    
    public List<Persond> getPersons() 
        return persons;
    
    public void setPersons(List<Persond> persons) 
        this.persons = persons;
    
    
    

4、正式解析

ParseDemo01.java

package xml;

import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class ParseDemo01 
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException 
        //1、获取解析工厂   SAXParserFactory是protect类型,所以用他的静态方法
        SAXParserFactory  factory=SAXParserFactory.newInstance();
        //2、从解析工厂获取解析器
        SAXParser parse=factory.newSAXParser();
        //3、加载文档Document注册处理器
        //4、编写处理器
        PersonHandler handler=new PersonHandler();
        parse.parse(Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("xml/person.xml")
                , handler);
        List<Persond> personds=handler.getPersons();     //得到一个List对象,里面包含两个Persond类型的对象<person1,person2>
        
        for(Persond p:personds) 
            System.out.println(p.getName()+"-->"+p.getAge());
        
    

打印结果

技术图片

 

以上是关于Java SAX解析的主要内容,如果未能解决你的问题,请参考以下文章

Java高级特性 第14节 解析XML文档 - SAX 技术

java解析XML① 之DOM解析和SAX解析(包含CDATA的问题)

Java SAX 解析

JAVA之DOM和SAX解析器

java webserver-xml--熟悉SAX解析流程-存储

Java 中,DOM 和 SAX 解析器有什么不同?