Java用SAX解析XML文件示例

来源:互联网 发布:qq语音输入软件 编辑:程序博客网 时间:2024/06/04 18:54

本文转自新浪博客: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();        }



1 0
原创粉丝点击