Java用SAX解析XML文件示例

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());

  }

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值