SAX解析XML file 介绍2

[list]
[*]1. Overview
[*]2. How to use DefaultHandler
[*]3. Focus on namespace
[/list]
[b]1. Overview[/b]
在第一篇文章介绍到SAX的基本用法,并且通过范例实现了一个简单的解析程序,其中实现了ContentHandler, ErrorHandler, 在coding的时候,你会发现很多方法我们根本就没有做任何处理,直接是个空实现,这对于造成了代码的冗余,别担心DefaultHandler已经帮我们做了这部份工作,我们只需要直接extends DefaultHandler就Okay了, 当然假如我们的class已经extends了另外一个类了,这样我们是不是只能束手就擒了呢?No! 我们可以使用组合的方式将DefaultHandler给组合进来, 如: setSAXHandler( ContentHandler defaultHandler ), 这样你就可以把你对DefaultHandler的实现给灵活的组合进来,同时也提高到了代码的灵活性及可扩展性; 另外本篇中将简要的介绍另外一个重要话题namespace。
[b]2. How to use DefaultHandler[/b]
DefaultHandler其实就是对接口ContentHandler, ErrorHandler等的一种适配,其中待解析的XML如下:

<?xml version="1.0" encoding="utf-8"?>
<S:books xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<ns3:book pages="1000" price="$99">
<name>Thinking in java</name>
<version>3.0</version>
</ns3:book>
<ns3:book pages="800" price="$40">
<name>JUnit in Action</name>
<version>2.0</version>
</ns3:book>
<ns3:book pages="900" price="$70">
<name>Lucene in Action</name>
<version>2.0</version>
</ns3:book>
</S:books>

根据上面的XML文件,我们可以了解到,这里使用了S,ns3分别作books, book的前缀,所以如果单纯的输出localName, 则只有少了prefix的节点名称, 所以我们可以输出name(prefix:localName), 这样就可以得到全称了, 当然这里还牵涉到uri, 其中http://www.w3.org/2003/05/soap-envelope即为S的uri.解析代码如下:

package com.chris.sax.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class XMLParser2 extends DefaultHandler
{

protected PrintStream output = System.out;
protected PrintStream error = System.err;
public void parserXMLFile( String fileName ) throws SAXException, IOException
{
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler( this );
reader.setErrorHandler( this );
InputSource source = new InputSource( new FileInputStream( new File( fileName ) ) );
reader.parse(source);
}
@Override
public void startElement( String uri, String localName, String name,
Attributes attributes ) throws SAXException
{
output.append("<" +name );
for( int i = 0; i < attributes.getLength(); i++ )
{
String attrName = attributes.getQName( i );
String attrValue = attributes.getValue( i );
output.append(" " + attrName + "=" + attrValue );
}
output.append(">");
}
@Override
public void endElement( String uri, String localName, String name )
throws SAXException
{
output.println( "</" + name + ">" );
}
@Override
public void characters( char[] ch, int start, int length )
throws SAXException
{

output.append( new String(ch, start, length ) );
}
@Override
public void startDocument() throws SAXException
{
output.println("<xml version=\"1.0\" encoding=\"utf-8\"?>");
}
public static void main( String[] args ) throws SAXException, IOException
{
XMLParser2 parser = new XMLParser2();
parser.parserXMLFile("books2.xml");
}
}

瞧这些代码,比起先前([url]SAX解析XML file 介绍[/url])那段实现简单清晰多了, 我们override 我们关心的Methods就Okay了。
代码运行结果如下:

<xml version="1.0" encoding="utf-8"?>
<S:books>
<ns3:book pages=1000 price=$99>
<name>Thinking in java</name>

<version>3.0</version>

</ns3:book>

<ns3:book pages=800 price=$40>
<name>JUnit in Action</name>

<version>2.0</version>

</ns3:book>

<ns3:book pages=900 price=$70>
<name>Lucene in Action</name>

<version>2.0</version>

</ns3:book>

</S:books>

[b]3. Focus on namespace[/b]
假如你要对你的nanmespace作特殊的处理,比如换掉其中的前缀,修改uri等,那么你可以override startPrefixMapping and endPrefixMapping来一起配合完成你要的效果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值