IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [转]Java用SAX解析XML文件示例

    lincyang发表于 2014-01-14 15:20:58
    love 0

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





沪ICP备19023445号-2号
友情链接