注册 登录
编程论坛 Android开发

sax 解析文件

li1114391600 发布于 2013-09-06 18:06, 3446 次点击
用sax解析xml文件,文件中有单标签怎么处理? 求大神解答。。。。。。。。。
1 回复
#2
FeiJ2013-12-16 11:25
SAX能处理大型的XML文件。对工作人员更灵活,可以用SAX建立自己的XML对象模型。SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。也可以把它称为授权事件模型。
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());  
        }
    }
}
1