Java SAX 解析xml

本文介绍了一种基于事件触发的XML解析方法——SAX解析,并通过一个具体的Java示例展示了如何使用SAXParserFactory和DefaultHandler进行XML文件的解析过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇中[url]http://gaofulai1988.iteye.com/blog/2262673[/url],主要讲解了DOM解析xml,它最大的不足之处是要在解析之前要载入这个XML文件,如果这个文件很大,它的效率就不高了。后来有人提出了基于标签事件触发的方式来解析XML文件。什么意思呢?

如果遇到一个<,那么它是一个标签的开始,如果遇到/>那么它是一个标签的结束。这些特殊标志出现的时候,就会触发一个事件来处理。

还是之前的那个XML。

<?xml version="1.0" encoding="UTF-8"?>
<Students>
<student>
<NO id="123">123456</NO>
<NAME>abc</NAME>
</student>
<student>

<NO id="234">456789</NO>
<NAME>def</NAME>
</student>
</Students>


代码如下:

public class SAXDemo extends DefaultHandler {
String tag;

public static void main(String args[]) {
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
SAXDemo reader = new SAXDemo();
sp.parse(new InputSource("D:" + File.separator + "test.xml"),
reader);
} catch (Exception e) {
e.printStackTrace();
}
}
// 处理标签的值
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
System.out.println("outprint value");
if (tag.equals("NO")) {
System.out.print("\tNO:" + new String(ch, start, length));
}
if (tag.equals("NAME")) {
System.out.println("\tNAME:" + new String(ch, start, length));
}
}

// 一定要写这个end方法,并且重新赋值
// 遇到/> 就会触发这个方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("2."+qName);
tag = "";
};

// 遇到 "<" 就会触发这个方法,qName就是标签名,Attributes是标签的属性
@Override
public void startElement(String uri, String localName, String qName,
Attributes attrs) {
System.out.println("1."+qName);
if (qName.equals("NO")) {
// 输出属性的值
System.out.print("id:" + attrs.getValue(0));
}
this.tag = qName;
}
}


上面加了一个特殊的输出,主要是为了看方法触发的先后情况。不管是startElement还是endElement,它们之后都会调用characters()这个方法,所以为什么要在endElement中将tag置空的原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值