解析技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北大青鸟中关村
解析技术–解析XML文件
在千禧年左右,当XML 第一次出现在很多Java 开发人员面前时,有两种基本的解析XML 文件的方法。SAX 解析器实际是由程序员对事件调用一系列回调方法的大型状态机。DOM 解析器将整个XML 文档加入内存,并切割成离散的对象,它们连接在一起形成一个树。该树描述了文档的整个XML Infoset 表示法。这两个解析器都有缺点:SAX 太低级,无法使用,DOM 代价太大,尤其对于大的XML 文件—整个树成了一个庞然大物。幸运的是,Java 开发人员找到第三种方法来解析XML 文件,通过对文档建模成“节点”,它们可以从文档流中一次取出一个,检查,然后处理或丢弃。这些“节点”的“流”提供了SAX 和DOM 的中间地带,名为“Streaming API for XML”,或者叫做StAX。(此缩写用于区分新的API 与原来的SAX 解析器,它与此同名。)StAX 解析器后来包装到了JDK 中,在javax.xml.stream 包。使用StAX 相当简单:实例化XMLEventReader,将它指向一个格式良好的XML 文件,然后一次“拉出”一个节点(通常用while 循环),查看。例如,在清单1 中,列举出了Ant 构造脚本中的所有目标:清单1. 只是让StAX 指向目标import java.io.*; import space.QName; import javax.xml.stream.*; import javax.xml.stream.events.*; import javax.xml.stream.util.*; public class Targets { public static void main(String[] args) throws Exception { for (String arg : args) {
XMLEventReader xsr = XMLInputFactory.newInstance() .createXMLEventReader(new FileReader(arg)); while (xsr.hasNext()) { XMLEvent evt = xsr.nextEvent(); switch (evt.getEventType()) { case XMLEvent.START_ELEMENT:
{ StartElement se = evt.asStartElement(); if (se.getName().getLocalPart().equals("target")) { Attribute targetName = se.getAttributeByName(new QName("name")); // Found a target!
System.out.println(targetName.getValue()); } break; } // Ignore everything else } } } } } StAX 解析器不会替换所有的SAX 和DOM 代码。但肯定会让某些任务容易些。尤其对完成不需要知道XML 文档整个树结构的任务相当方便。
请注意,如果事件对象级别太高,无法使用,StAX 也有一个低级API 在XMLStreamReader 中。尽管也许没有阅读器有用,StAX 还有一个XMLEventWriter,同样,还有一个XMLStreamWriter 类用于XML 输出。