Java用SAX解析XML文件示例
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());
}
}
}