Java用SAX解析XML文件示例

本文转自新浪博客:http://blog.sina.com.cn/s/blog_492dbb6b0100fa4a.html

此文的方法是SAXParser的基本用法,在Android开发中同样适用。

以下为原文:

SAX 解析器采用了基于事件的模型,它在解析 XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。

下面以两种类型的XML架构说明SAX对xml文件的解析:

一、 获取元素属性值

<?xml version="1.0" encoding="UTF-8"?>
<emps>
    <emp id="1">
        <name>zhangsan</name>
        <sex>man</sex>
    </emp>
    <emp id="2">
        <name>lisi</name>
        <sex>women</sex>
    </emp>
</emps>

命名为example.xml

在本例中我们将读取元素<emp>的属性id=1和id=2,代码如下:

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;  

import org.xml.sax.helpers.DefaultHandler;

public class SAXParserTest extends DefaultHandler{

    public SAXParserTest() {

        super();

    } 

    public void startElement(String uri,String localName,String qName,Attributes attr){  

       if(attr.getLength()>0){  

           for(int i = 0;i<attr.getLength();i++){  

               System.out.println(attr.getQName(i)+" = "+attr.getValue(i));  

           }  

       }  

    }  

    public static void main(String[] args){  

        try{    

          //实例化用于分析的工厂

            SAXParserFactory factory = SAXParserFactory.newInstance();

           //实例化分析类

            SAXParser parser = factory.newSAXParser();

            SAXParserTest handler = new SAXParserTest();  

            parser.parse("example.xml",handler);  

           }catch(Exception e){  

            System.out.println(e.toString());  

        }  

    }  

 }

二、获取元素块名字属性值
<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl"?>

<property>

  <name>search.response.default.numrows</name>

  <value>10</value>

  <description>

  The default number of rows to return if none is specified.

  </description>

</property>

 

<property>

  <name>searcher.response.maxage</name>

  <value>86400</value>

  <description>

  The maxage of a response in seconds. Used in caching headers.

  </description>

</property>

</configuration>

命名为nutch-default.xml

在本例中我们将读取<name>和<value>所表示的值,即<name>=<value>,代码如下:

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;  

import org.xml.sax.helpers.DefaultHandler;

import org.xml.sax.SAXException;

import java.util.Properties;

public class SAXParserTest2 extends DefaultHandler{

    private Properties props;   //用于存放名字属性对(key-value)

    private String currentName; //当前扫描到的键值

    private StringBuffer currentValue = new StringBuffer();   //当前名字对应的值

    private String Name,Value;//键值对

    public SAXParserTest2(){

        super();

        this.props=new Properties();

    } 

    

    public void startElement(String uri,String localName,String qName,Attributes attr){  

        currentValue.delete(0,currentValue.length());

        this.currentName=qName;

    }

     

  //碰到节点开始和结束之间的字符<element>***</element>

    public void characters(char[] ch,int start,int length) throws SAXException{

        currentValue.append(ch,start,length);

    }

    //碰到节点结束</element>  

    public void endElement(String uri,String localName,String qName){  

        String name=currentName,value=currentValue.toString().trim();

        if(name!=""&&value!="")

            System.out.println(name+"="+value);

        if(name=="name")

            Name=value;

        if(name=="value")

            Value=value;

        if(qName=="property")

               props.put(Name,Value);

       

        this.currentName="";

        currentValue.delete(0,currentValue.length());

    }  

     public String getElementValue(String elementName){

        //elementValue:对应于elementName的节点的属性值

        String elementValue=null;

        elementValue=props.getProperty(elementName);

        return elementValue;

    }

    public static void main(String[] args)    {  

        try{  

            SAXParserFactory factory = SAXParserFactory.newInstance();

            SAXParser parser = factory.newSAXParser();

            SAXParserTest2 handler = new SAXParserTest2();  

        parser.parse("nutch-default.xml",handler);                      System.out.println(handler.getElementValue("searcher.response.maxage "));

           }catch(Exception e){  

            System.out.println(e.toString());  

        } 

    } 

}

//参见:http://www.cnblogs.com/foresthjj/articles/863147.html

//http://damiao-cn.javaeye.com/blog/228941

后记:

下面是XMLReader的用法:

        SAXParserFactory parserFactory = SAXParserFactory.newInstance();
        try {
            XMLReader xmlReader = parserFactory.newSAXParser().getXMLReader();
            SAXParserTest2 handler = new SAXParserTest2();
            xmlReader.setContentHandler(handler);
            xmlReader.parse(new InputSource(new StringReader(result)));
        } catch (Exception e) {
            e.printStackTrace();
        }



你可能感兴趣的:(Java用SAX解析XML文件示例)