这里用SAX 来解析:
SAX是采用一边读入数据一边解析的方式,这样可以很好的避免大文件解析的效率和性能问题(像什么内存溢出之类的),但缺点就是插入不方便;
下面开始正题:
SAX 是读取一个一个节点进行解析的, 如 :
<A>
<B>123</B>
<C>123</C>
</A>
<A>
<B>234</B>
</A>
SAX startElement 方法 会先读取第一个A标签,找到A标签的时候 会调用 实现SAX 类的characters方法 来读取其中的内容, 当读取的内容遇到标签的时候
又会调用startElement 方法,这样周而复始,知道把A标签解析完, 然后开始解析第二个A标签……
执行顺序为:
(1)startDocument ---》(2)startElement ---》(3)characters ---》 (4)endElement ----》(5)endDocument
其中2-4 是可以被多步执行的;在startElement当中除了可以调用characters解析内容外 还可以从attributes里面读取属性,
然后将值存入某个定义的变量中(如果有N个相同子元素子标签的话, 要注意对每个子标签值得转存,以免数据被覆盖)
/**
* @author lfssay
*这里继承DefaultHandler 就行了,实现ContentHandler要实现里面所有的方法
*通常只需要5个方法就能完事儿
*
*在解析的过程中,如果是相同标签的并列, 会一个一个去解析,标签的内容也只是在解析完该标签期间有效
*就是下面的定义标签名称,因为在新的标签解析当中, 如果有相同名称标签就会被覆盖
*/
public class MyContentHandler extends DefaultHandler{
// 定义标签名称
String hisname,name,sex,status;
String tageName;
/**
* 开始解析document
*/
@Override
public void startDocument() throws SAXException {
// super.startDocument();
System.out.println("----begin the anlysis document----");
}
/**
* 结束解析document
*/
@Override
public void endDocument() throws SAXException {
// super.endDocument();
System.out.println("---end anlysis document----");
}
/**
* 开始解析标签
* uri:命名空间
* localName:不带前缀的标签名
* qName:带前缀的标签名
* attributes:属性
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tageName = localName;
// 得到worker标签的属性值
if(localName.equals("worker")){
for(int i=0;i<attributes.getLength();i++){
System.out.println("===keyValues:"+attributes.getLocalName(i)+"---"+attributes.getValue(i));
}
}
// super.startElement(uri, localName, qName, attributes);
}
/**
* 结束解析标签
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(localName.equals("worker")){
output();
}
// super.endElement(uri, localName, qName);
}
/**
* 得到标签中间的内容
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tageName.equals("name")){
name = new String(ch,start,length);
}else if(tageName.equals("sex")){
sex = new String(ch,start,length);
}else if(tageName.equals("status")){
status = new String(ch,start,length);
}
// super.characters(ch, start, length);
}
public void output(){
System.out.println("name is --"+name);
System.out.println("sex is ---"+sex);
System.out.println("status is --"+status);
}
SAX实现类代码如下,样例: