SAX之使用SAX解析文档

记住,在任何一个基于SAX的应用程序中,你要做的第一件事情就是去获取一个实现了org.xml.sax.XMLReader接口的类的实例。这就是为什么首先让你去下载兼容SAX解析器的原因。

实例化阅读器

所有兼容SAX标准的XML解析器都必须实现SAX中的org.xml.sax.XMLReader接口,例如,在Xerces提供的实现中,org.apache.xerces.parsers.SAXParser类就实现了XMLReader接口。而你则需要去实例化该类,并用它来解析XML文档,如:

//实例化Reader
XMLReader reader = new org.apache.xerces.parsers.SAXParser();
//用解析器进行解析
reader.parse(uri);

使用上述代码会将你和解析器供应商紧密的联系起来(紧耦合),但是,你可以使用SAX的org.xml.sax.helpers.XMLReaderFactory类将两者分离开来:

XMLReader reader = XMLReaderFactory.createXMLReader();

然后,只需要设置org.xml.sax.driver系统属性,就可以不需要导入也能得到XMLReader类:

$ java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser

更棒的是,大多数解析器提供者会在系统内部设置好这个属性,这就意味着你一点也不用担心这个系统属性。只需要调用createXMLReader()方法,往下直就行了。注意:正如你所想的,Apache Xerces解析器在内部也已经设置好了org.xml.sax.driver属性的值

解析文档

将阅读器实例化后,就可以调用它的parse()方法去解析XML文档了。parse()方法还可以接收一个org.xml.sax.InputSource类型或者是字符串类型的参数,不过比较好的方式是使用SAX中的InputSource类型的参数,因为我们可以用I/O InputStream,Reader或者是URI字符串多种方式来创建InputSource类型的对象。

使用InputSource取代URI的优势是显而易见的:InputSource能为解析器提供更多的信息。InputSource封装了一个单独的对象和要解析的文档的信息。当一个系统ID,公共ID或者一个流同时关联到一个URI时,使用InputSource来封装非常方便(注:系统ID表示一个本地资源,公共ID表示一个网络资源)。这个类有处理系统ID,公共ID,字符编码,字节流(java.io.InputStream)和字符流(java.io.Reader)的存储器(accessor)方法和修改器(mutator)方法。当把InputSource作为参数传递给parse()方法时,SAX会保证解析器不会修改InputSource。解析器的原始输入经解析器或XML应用程序处理后依然保持不变。示例:

//解析
InputSource inputSource = new InputSource(
    new java.io.FileInputStream(new java.io.File(xmlURI)));
reader.parse(inputSource);

在文档的解析过程中,如果你没有在回调事件中编写代码,那仅仅只是简单地完成了默认解析而已。解析器所提供的回调事件,使得开发人员可以在解析器执行默认的解析过程时,通过编码写事件处理代码,来对XML文档中的数据,元素,属性的解析进行特定的处理,以及完成与其他程序的交互。






转载于:https://my.oschina.net/fhd/blog/367393

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值