随着 SVG 在 Web 中的广泛应用,基于 VTD-XML 对 SVG 实现图形查询的技术,将给网络图形搜索引擎带来革命性的变化。
SVG 是基于 XML(可扩展标识语言)可缩放矢量图形的一个全新的标准开放的矢量图形和动画格式。SVG 支持:几何图形、文字标注、动画、色彩变化、滤镜、添加音效等众多的功能,可以显示出各种高质量的矢量图形,最为关键的是: SVG 不同于传统的二维图形和">动画制作,它完全是用普通文本来描述的,是一种非常适合网络的基于文本的矢量图形格式。SVG 基于纯文本的特性,使它具备像文字信息一样的可检索性,从而将使人们对 SVG 图形检索的梦想成为现实。 SVG 中的文字可以被网络搜索引擎作为关键词搜寻。利用这一性质,通过 SVG 中定义的文字,就可以制作出非常高效的图形搜索引擎。要对 SVG 进行检索必须先对其进行解析,因为 SVG 是一种标准的 XML 格式,所以可以采用 DOM、SAX 技术进行解析,但这两种解析技术在内存使用及解析速度方面都不尽人满意,这就限制了 SVG 文本检索的优势。
针对以上问题,本文采用 VTD-XML(Virtual Token Descriptor) ——虚拟令牌描述符技术对 SVG 进行解析。 VTD-XML 是一种新的开源的 XML 处理 API, 它能够克服 DOM 和 SAX 的一些问题。 VTD-XML 能够在内存中对 XML 进行快速搜索并提供 XPath 查询的支持,这为我们快速检索图形提供了可能。伴随着 SVG 在网络中越来越广泛的应用,针对 SVG 的解析效率及搜索速度自然成为大家关注的对象。VTD-XML 作为下一代的 XML 处理模型,提供超越 DOM 和 SAX 的广泛用途和更佳选择,不仅可以简化 XML 编程,也使选择 XML 处理模型更加容易。
SVG(Scalable Vector Graphics)概述
SVG(Scalable Vector Graphics,意为可缩放的矢量图型)。它是基于 XML 标记语言,是用来描述二维矢量图型的一种图形格式。SVG 由 W3C 制定的一个开放标准,正由于他的开放性,任何公司和个人都可以参与 SVG 的开发和推广,众多知名企业(例如微软)也都对它提供了支持。
由于 SVG 是 XML 的一个应用标准,严格遵从 XML 语法,采用文本格式的描述性语言来描述图像内容的特性,使 SVG 具备了许多优点。SVG 可以用任何文本工具打开易于修改和编辑。它是矢量图形格式,与栅格图像相比,它可以任意缩放而不影响图形的质量,文件的大小仅和图形的复杂度有关,因此它很适合网络传输,并具备像文字信息一样的可检索性,可以方便的建立文字索引,从而实现基于内容的图像搜索。SVG 图形格式可以用来动态生成图形。例如,可用 SVG 动态生成具有交互功能的地图,嵌入网页中,并显示给终端用户。除此之外,SVG 可以紧密地与现有技术相互结合,来支持给予 SMIL 标准的动态变化和基于 JavaScript 脚本的 SVG 对象控制等。SVG 图形格式还支持多种滤镜和特殊效果,在不改变图像内容的前提下可以实现位图格式中类似文字阴影的效果。
SVG 带有许多基本的图形元素,只要通过组合基本图形元素就可以构建出 SVG 文件。在现实世界中,空间地物的信息化可概括地划分为 5 类:点状物体、线状物体、面状物体、注记以及栅格物体。空间信息系统中,它们被定义为 5 大类空间对象,而 SVG 以此为基础定义了相应的图形图像对象,其对应关系如表 1 所示。
表 1,空间实体与 SVG 的对应表示
空间实体 SVG 中的表示 点 <ellipse>,<circle> 线 <polyline>,<path>,<line> 面 <polygon>,<circle>,<ellipse> 文本 <text> 栅格体 <image>
VTD-XML 解析 SVG
当我们选择解析处理 SVG 文件的时候,我们通常有两种选择:DOM,SAX。DOM 的官方规范是由 W3C 开发的,是独立于平台和语言应用程序接口,它的原理是将 XML 文件的信息以树形的方式构建,并提供了遍历这棵树的接口和方法。DOM 相比较 SAX 易用性强,并且遍历简单,支持 XPath,但 DOM 是以层次结构组织的节点的集合,分析该结构需要加载整个文档和构造层次结构,因此它的解析速度太慢,内存占用过高一般是源文件大小的 5~10,对于大文件来说几乎无法使用。SAX 是一个基于 XML 事件驱动的 API,它将 XML 文件以数据流的方式处理,即随着 XML 数据的顺序读入而依次处理数据。SAX 的特点正好与 DOM 相反,它的解析速度快,内存占用不与 XML 的文件大小相关联,但因为没有结构信息,所以易用性可维护性差,并且无法遍历,不支持 XPath。
基本上 DOM 与 SAX 是正好相反的两个极端,任何一个都不能很好的满足我们的大部分要求,因此我们需要找出另外一种解析方法。
VTD-XML 便是对以上问题的思考后给出的答案,它是一个新型的、开源的、非提取性的 (non-extractive)XML 解析技术,不同于现行的 XML 处理技术,VTD-XML 能够实现数据的随机存取,而不会导致过多的资源浪费。
由于它出色的机制,很好的避免了上面所提出的各种问题,并且还带来了非提取性的其他好处,如,快速的解析与遍历、对 XPath 的支持、增量更新等等。表 2 是 VTD-XML, DOM 和 SAX 之间的比较:
表 2,VTD-XML,DOM 和 SAX 之间的比较
比较内容 VTD-XML SAX DOM 内存占用 XML 源文件大小的 1.3 倍 ~1.5 倍 内存占用与源文件大小无关 XML 源文件大小的 5 倍 ~10 倍 解析速度 最快,是 SAX(在没有插入任何额外的处理逻辑时)的 1.5 倍 ~2.0 倍 慢于 VTD-XML, 快于 DOM 最慢 随机读取 支持 不支持 支持 增量更新 支持 不支持 不支持
通过将 VTD-XML 与现有的 DOM 和 SAX 技术比较得出,VTD-XML 克服了以上两种解析技术存在的问题,不论是在内存占用率,还是在解析速度等方面来看都能满足对 SVG 图形的快速搜索的要求。