网乐原科技

直播中

news center新闻中心
首页 > 资讯中心 > 软件技术

构建自己的轻量级XML DOM分析程序

发布时间:2008-03-22     阅读数: 次       来源:网乐原科技
  XML正迅快速的成为数据存储和交换的标准格式流行开来了。现在可用的完整的Java XML分析器非常庞大而且功能强大--但是实现这些强大的功能的同时也要消耗等量的资源。举例来说,流行的Apache Xerces-J分析器超过1.7 MB,而最新的完整的Sun JAXP(用于XML处理的Java应用编程接口)实现程序包超过了3MB。因此使用一个功能强大的XML分析器可能过于浪费。如果配置环境是一个Java小程序或者是一个J2ME应用程序,网络带宽或者系统存储器的制约可能根本不能够使用完整的XML分析器。本文将告诉你如何构建一个轻量级的XML DOM分析程序。

  开始编写SimpleDOMParser

  SimpleDOMParser是一个使用Java写的高度简化和超轻量级的XML DOM分析器。 你可以将配置整个分析器配置为一个小于4KB的.jar文件。源程序还不到400行呢。

  显然,使用这么小的代码,SimpleDOMParser将不支持XML域名空间,不能够理解多字符集编码或者以DTD文件或者schema验证文件;但是SimpleDOMParser能做的就是把符合语法规则的XML标记解析为一个类似于DOM的元素树,让你执行从XML格式化文本提取的数据的公共任务。

  为什么使用DOM作为模型而不是SAX呢?这是因为DOM提供一个比SAX更加易用的程序接口。与SAX不同的是,当你把一个XML文件作为一个DOM树来处理的时候,这个文件内的所有的信息都是可以利用的。虽然SAX分析模型能够提供比DOM模型更加优异的性能和利用更少的存储空间,但是大部分开发者在使用SAX的时候都会发现他们自己正在创建一个完整的或者部分的DOM树。使用SAX,一个应用程序每次只能处理一条标记。如果其它的标记内容在处理的过程中必须被用到,那你就必须在处理的整个过程保持一种全局状态。而保持全局状态正是DOM模型目的的精髓。但是许多小型的XML应用程序不需要完整的DOM模型。因此,SimpleDOMParser提供到标记名、层次和内容的访问,但是不涉及完整的W3C DOM的许多用不上的功能。

  简化DOM模型

  一个DOM树是由分析XML文件产生的结点组成。结点是一个XML实体的非存储表现。标准W3C DOM模型有几种类型的结点。 举例来说,一个文本结点表示在XML文件中的一段文本,一个元素结点表示XML文件而一个属性结点表示一个元素内部的属性名和值。

  DOM是一个树,因为除了根或文件结点以外的每个结点都有一个父结点。举例来说,属性结点总是和一个元素结点相关联,而用来封装元素的起始标记和结束标记中的文本是映射到一个文本结点的。文本结点是元素结点的一个子节点。所以,即使很简单的XML文件的表现也可能会需要很多种节点类型。举例来说,图1表示下面XML文件的一个W3C DOM树形表示。



<parser>SimpleDOMParser</parser>  

  正如你在图1中所看见的,DOM模型使用一个document类型节点来封装整个XML文件,所以DOM使用三种不同的节点。通过把所有的DOM节点类型抽象成为一个单独的类型SimpleElement来尽可能的简化DOM模型。一个SimpleElement获得一个XML元素的关键的信息,比如标识名、元素属性和任何封装的文本或者XML。此外,SimpleDOMParser不使用任何特殊的节点类型表示最高等级的文档。结果是大大地简化了DOM树,使之只包含SimpleElement节点。图2表示了简化的DOM树。



  代码段1给出了SimpleElement类的完整的源程序。

public class SimpleElement {
private String tagName;
private String text;
private HashMap attributes;
private LinkedList childElements;

public SimpleElement(String tagName) {
this.tagName = tagName;
attributes = new HashMap();
childElements = new LinkedList();
}

public String getTagName() {
return tagName;
}

public void setTagName(String tagName) {
this.tagName = tagName;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

public String getAttribute(String name) {
return (String)attributes.get(name);
}

public void setAttribute(String name, String value) {
attributes.put(name, value);
}

public void addChildElement(SimpleElement element) {
childElements.add(element);
}

public Object[] getChildElements() {
return childElements.toArray();
}
}  

网乐原科技

客服热线:0771-5761507

QQ:53290011

QQ邮箱:53290011@qq.com

工作时间:周一到周五 9:00-18:00

地址:广西南宁市江南万达写字楼C16栋1309室

物联网开发

关注我们

微信小商店 腾讯QQ客服 微信客服