专利名称:一种svg文件快速解析方法及系统的制作方法
技术领域:
本发明涉及一种矢量图形解析技术,尤其涉及一种SVG文件解析技术。
背景技术:
计算机中显示的图形一般可以分为两大类——矢量图和位图矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、 圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真。位图也称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。可缩放矢量图形(Scalable Vector Graphics,简称“SVG”)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。SVG由W3C制定,是一个开放标准。SVG 严格遵从XML语法,并用文本格式的描述性语言来描述图像内容,因此是一种和图像分辨率无关的矢量图形格式。SVG包括3种类型的对象矢量图形(包括直线、曲线在内的图形边)、点阵图像和文本。各种图像对象能够组合、变换,并且修改其样式,也能够定义成预处理对象。与传统的图像格式不同的是,SVG采用文本来描述矢量化的图形,这使得SVG图像文件可以像HTML网页一样有着很好的可读性。当用户用图像工具输出SVG后,可以用任何文字处理工具打开SVG图像,并可看到用来描述图像的文本代码。掌握了 SVG语法的人甚至可以只用一个记事本便可以读出图像中的内容来。SVG完全支持文档物件模型(Document Object Model,简称“DOM”)。DOM是一种文档平台,它允许程序或脚本动态的存储和上传文件的内容、结构或样式。由于SVG完全支持D0M,因而SVG文档可以通过一致的接口规范与外界的程序打交道。SVG以及SVG中的物件元素完全可以通过脚本语言接受外部事件的驱动,例如鼠标动作,实现自身或对其他物件、图像的控制等。这也是电子文档应具备的优秀特性之一。现有解析SVG文件的方法一般分为2种一种是借助解析XML文件解析器将SVG文件以先解析成XML D0M,再从XML DOM转换成SVG D0M。该方式须经过2次解析才能达到目的第一次将SVG文件解析成XML DOM ; 第二次将XML DOM转换为SVG D0M。很明显这个过程将花费至少大于1倍单次解析文件的时间,因为除了解析文件外,将XML DOM转换为SVG DOM也需要花一定的时间。显然这种方式效率比较低,这种技术只能运用在SVG文件较小、或对效率要求不高的场合。另一种方式是对SVG文件直接解析,直接生成SVG D0M,该方式与第一种2次解析的方式相比更快速。一般现有的解析方式都是以SVG的节点标签作为关键字,在解析的过程中通过比较关键字的方式创建SVG节点对象。具体地说,SVG所涉及到的图形对象有矩形、直线、圆、椭圆、折线、多边形、路径、文本、点阵图像等等。其中每种图形对象又有自己的属性,如矩形有X(左顶点X坐标)、 y (左顶点y坐标)、width(宽度)、height (高度)等。每个图形对象可以作为单独的节点,图形对象之间也可以进行组合,形成新的节点。SVG的节点标签是描述这些图形对象以及图形相关信息的关键字,如矩形节点的标签为“rect”,直线节点的标签为“line”,椭圆节点的标签为“ellipse”,水平渐变色节点的标签为“linearGradient”等等。如下是一个SVG文件格式的例子,描述的是一个起点位置为(138,91)、宽98、高88 的白色矩形,和一个中心位置为(387,147. 5)、长轴88、短轴47. 5的黑色椭圆形< ? xml vers ion = " 1.0〃 encoding = " utf-8" standalone = " no" ? > /*xml标准文件头*/<svg width = " 640〃 height = " 480〃 version = " 1.1〃 > /*svg 根节点位置*/<rect χ = “ 138 “ y = “ 91 “ width = “ 98 “ height = “ 88 “ fill ="#FFFFFF〃 stroke = “ #000000" /> /* 矩形,起点位置(138,91),宽 98,高 88,填充白色,线条颜色为黑色*/〈ellipse cx = “ 387 “ cy = “ 147. 5 〃 rx = “ 88 “ ry = “ 47. 5 〃 fill ="#000000〃 stroke = “ #000000〃 /> /* 椭圆,中心位置(387,147. 5),长轴 88,短轴47. 5,填充黑色,线条颜色为黑色*/</svg>现有的将SVG文件解析成SVG DOM结构的过程如下读取SVG文件,以SVG文件中每个节点标签作为一个对象,标签内的属性作为对象的属性,建立对应该属性的对象。如解析到“rect”字符串,则就需要创建一个矩形对象,该矩形对象的属性即该节点标签的属性。同样,SVG文件中节点的属性也有对应的属性标签,如χ表示横轴位置,y表示纵轴位置,width表示宽度,fill表示填充颜色,srtoke表示线条颜色等等。传统的解析方式是当解析到一个节点标签后,就需要跟已定义的节点标签进行比较,当比较的节点标签跟定义的节点标签符合时,就创建对应对象。如定义“rect”, “ellipSe”,“line”等标签。当读取到文件中的一个节点标签时,将该节点标签跟已定义的 "rect'\" ell ipse", "line"比较,当比较发现该节点标签是“rect”时,创建对应的矩形对象。这样就得花费较多的时间在字符串比较上。假设解析到的字符串为tagname,通过计算机语言将该节点标签与已定义节点标签进行比较If (tagname == "rect"){//创建矩形对象}......else if (tagname ==" line"){//创建直线对象} 上述实现方式要通过比较字符串来实现,在SVG文件较大的情况下,仅比较字符串就需要花费较多的时间。由于SVG工业领域的应用一般文件都比较复杂,文件节点繁多,文件内容丰富,因此文件本身都比较大,SVG节点数很可能超过1万个,在解析过程中需要花费大量时间进行SVG节点标签的比较,使得文件大小以及节点数量成为影响SVG解析器速度的最大问题。在SVG应用场合,一般用户都希望自己的操作能够得到快速响应,因此急需要一种快速解析大文件多节点的SVG文件的方法。
发明内容
本发明主要解决的技术问题是提供一种SVG文件快速解析方法及其系统,使得 SVG文件的解析速度得到增快,尤其是大文件多节点的SVG文件解析速度明显增快。为了解决上述技术问题,本发明提供了一种SVG文件快速解析方法,包含以下步骤将SVG文件中的各种类别的节点标签分别与一简单标识相对应,建立节点标签和简单标识的映射关系表;解析所述SVG文件的过程中,在读取到节点标签时,通过映射算法从该映射关系表中找到该节点标签对应的简单标识;根据该简单标识判断该节点标签所对应的对象类别,并创建对应类别的对象。作为上述技术方案的改进,该方法还可以包含以下步骤预先保存各简单标识所对应的对象类别;所述根据该简单标识判断该节点标签所对应的对象类别,并创建对应类别的对象的方法如下将所述查找到的简单标识与各已有的简单标识进行对比,如果一致,则建立该简单标识对应的类别的对象。作为上述技术方案的改进,所述节点标签一般为不固定长度的字符串。作为上述技术方案的改进,所述简单标识可以为数字、字符、或固定长度的字符
串ο作为上述技术方案的改进,所述简单标识可以是整数。作为上述技术方案的改进,所述映射关系表为哈希映射表;所述映射算法为 “hash-map” 算法。作为上述技术方案的改进,该方法还可以包含以下步骤将SVG文件中的各种节点标签的属性标签分别与一简单标识相对应,建立属性标签和简单标识的映射关系表,并保存各简单标识对应的属性类别;解析所述SVG文件的过程中,在读取到属性标签时,通过映射算法从该属性标签与简单标识的映射关系表中找到该属性标签对应的简单标识;将该简单标识与所保存的各简单标识进行比较,确定该简单标识所对应的属性类另Ij,并为对象设置对应类别的属性。本发明还提供了一种SVG文件快速解析系统,包含存储模块,用于存储SVG文件中各种类别的节点标签与对应 的简单标识的映射关系表;映射模块,用于在解析所述SVG文件的过程中,读取到节点标签时,通过映射算法从该映射关系表中找到该节点标签对应的简单标识;
对象创建模块,用于根据该映射模块查找到的简单标识判断该节点标签所对应的对象类别,并创建对应类别的对象。作为上述技术方案的改进,所述存储模块还可以用于存储各简单标识所对应的对象类别;所述对象创建模块将所述查找到的简单标识与各已有的简单标识进行对比,如果一致,则建立该简单标识对应的类别的对象。作为上述技术方案的改进,所述节点标签一般为不固定长度的字符串;所述简单标识可以是数字、字符、或固定长度字符串。作为上述技术方案的改进,所述简单标识可以是整数。 作为上述技术方案的改进,所述映射关系表为哈希映射表;所述映射算法为 “hash-map” 算法。作为上述技术方案的改进,所述存储模块还可以用于存储SVG文件中各种节点标签的属性标签与对应的简单标识的映射关系表;所述映射模块还用于在解析所述SVG文件的过程中,读取到属性标签时,通过映射算法从该属性标签与简单标识的映射关系表中找到该属性标签对应的简单标识;所述对象创建模块还用于根据该映射模块查找到的简单标识判断该属性标签所对应的属性类别,并为对象设置对应类别的属性。本发明实施方式与现有技术相比,主要区别及其效果在于将SVG文件中的各种类别的节点标签分别与一简单标识相对应,建立节点标签和简单标识的映射关系表;解析 SVG文件的过程中,在读取到节点标签时,通过映射算法从该映射关系表中快速找到该节点标签对应的简单标识;根据该简单标识对比并判断该节点标签所对应的对象类别,创建对应类别的对象。由于SVG文件中的节点标签一般由长度不固定的字符串构成,在文件的解析过程中需要进行大量节点标签的对比和辨识,字符串的对比速度相对较慢,使得辨识该节点标签的速度变慢,而本发明实施方式首先通过映射技术将字符串映射为简单标识(如数字、 单个字符、或2位字符串),在解析SVG节点标签时,直接对简单标识进行对比,从而无需再逐一进行不固定长度的字符串的比较,数字或单个字符的比较速度相对不固定长度的字符串的比较速度而言要快很多,因此在SVG文件中含有大量节点标签的情况下,采用本发明实施方式可以明显提高SVG文件的解析速度。
下面结合附图和具体实施方式
对本发明作进一步详细说明。图1是现有技术中SVG文件范例对应的矢量图形示意图;图2是本发明第一实施方式的SVG文件快速解析方法流程图。
具体实施例方式为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明的实施方式作进一步地详细描述。本发明第一实施方式涉及一种SVG文件快速解析方法。
本实施方式中,需要预先将SVG文件中所有的节点标签分别与一个整数对应,将节点标签与整数的对应关系形成一个映射关系表,如哈希表,映射关系为节点标签映射到整数。并且,预先保存不同的整数所对应的对象类别,或者预先设置不同整数所需要创建的对象。具体解析流程如图2所示。步骤201 读取并解析SVG文件,在解析到节点标签时,进入步骤202。步骤202 通过映射算法,如hash-map算法,从节点标签与整数的映射关系表中快速找到该节点标签对应的整数。该映射算法所占用的时间极少,不会影响SVG文件解析整体速度。
步骤203 将映射得到的整数逐一与已有各整数相比较,如果相同,则建立该整数对应类别的DOM对象。举例而言,设置矩形标签“rect”对应整数1,直线标签“ line”对应整数2,椭圆标
签“ellipse”对应整数3,水平渐变色标签“linearGradient”对应整数4.......同时,保
存简单标识1对应矩形对象;2对应直线对象;3对应椭圆对象;4对应渐变色对象。假设解析到的字符串为tagname,首先通过映射算法找到字符串对应的数字int > iterator iter = tagmap. find(tagname);然后将映射得到的结果与已有数字相比较,如果映射结果为1则创建矩形对象, 如果映射结果为2则创建直线对象,如果映射结果为3则创建椭圆对象等等。if (iter- > second ==1){//是矩形,在这里创建矩形对象.}else if (iter- > second ==2){//是直线,在这里创建直线对象.}由于SVG文件中的节点标签一般由字符串构成,且字符串的长度不规则,使得节点标签的对比速度相对较慢,在SVG文件中含有大量节点标签的情况下,明显降低了 SVG文件的解析速度;采用本实施方式后,无需再逐一进行字符串的比较,数字的比较速度相对长度不规则的字符串的比较速度而言要快很多,因此在SVG文件中含有大量节点标签的情况下,采用本实施方式可以明显提高SVG文件的解析速度。需要说明的是,本实施方式中简单标签除了可以是整数以外,也可以是其他类型的数字、字符或固定长度的字符串(如2位的字符串),其他数字或字符的比较速度同样要比字符串快很多,一样能够达到加快SVG文件解析速度的目的。本实施方式除了适用于SVG文件的解析外,也一样适用于其它遵循XML格式的节点有意义的文件的解析过程。本发明第二实施方式同样涉及一种SVG文件的快速解析方法,与第一实施方式思想大致相同,其区别在于,本发明第一实施方式中,仅将节点标签与数字相对应,建立映射关系表;而本实施方式中,进一步将各种节点标签中的属性标签与数字相对应,也建立属性映射关系表,并保存各简单标识对应的属性类别。如设置横轴位置标签X对应1,纵轴位置标签y对应2,宽度标签width对应3,填充颜色标签fill对应4,线条颜色标签srtoke对应5等等。在解析SVG文件的过程中,读取到属性标签时,同样通过映射算法从该属性映射关系表中找到该属性标签对应的简单标识;将找到简单标识与所保存的各简单标识进行比较,确定该找到的简单标识所对应的属性类别,为对象设置对应类别的属性。由于每个节点通常包含多个属性,属性标签一般也是由长度不固定的字符串构成,在节点数量较多的情况下,对比和辨识这些属性标签同样需要花费大量时间,通过本实施方式,使得属性标签的对比和辨识速度明显增快,达到进一步增快SVG文件解析速度的效果。本发明第三实施方式涉及一种SVG文件快速解析系统,包含存储模块,用于存储 SVG文件中各种类别的节点标签与对应的简单标识的映射关系表,以及各简单标识所对应的对象类别;映射模块,用于在解析SVG文件的过程中,读取到节点标签时,通过映射算法从该映射关系表中找到该节点标签对应的简单标识;对象创建模块,用于根据该映射模块查找到的简单标识判断该节点标签所对应的对象类别,并创建对应类别的对象;具体可以将查找到的简单标识逐一与各已有的简单标识进行对比,如果一致,则建立该简单标识对应的类别的对象。 其中,SVG文件中的节点标签一般为不固定长度的字符串,对应的简单标识可以是数字、字符或固定长度字符串等,尤其以整数为佳。上述映射关系表可以是哈希映射表,映射算法可以是“hash-map”算法,也可以是现有的其他映射方法。作为进一步改进,该存储模块还可以用于存储SVG文件中各种节点标签的属性标签与对应的简单标识的映射关系表,以及保存各简单标识对应的属性类别;该映射模块还可以用于在解析SVG文件的过程中,读取到属性标签时,通过映射算法从该属性标签与简单标识的映射关系表中找到该属性标签对应的简单标识;该对象创建模块还可以用于根据该映射模块查找到的简单标识判断该属性标签所对应的属性类别,并为对象设置对应类别的属性。具体可以将映射模块找到的简单标识与存储模块中所保存的各简单标识进行比较,确定该简单标识所对应的属性类别,并为对象设置对应类别的属性。虽然通过参照本发明的某些优选实施方式,已经对本发明进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。
权利要求
1.一种可缩放矢量图形SVG文件快速解析方法,其特征在于,包含以下步骤将SVG文件中的各种类别的节点标签分别与一简单标识相对应,建立节点标签和简单标识的映射关系表;解析所述SVG文件的过程中,在读取到节点标签时,通过映射算法从该映射关系表中找到该节点标签对应的简单标识;根据该简单标识判断该节点标签所对应的对象类别,并创建对应类别的对象。
2.根据权利要求1所述的SVG文件快速解析方法,其特征在于,还包含以下步骤预先保存各简单标识所对应的对象类别;所述根据该简单标识判断该节点标签所对应的对象类别,并创建对应类别的对象的方法如下将所述查找到的简单标识与各已有的简单标识进行对比,如果一致,则建立该简单标识对应的类别的对象。
3.根据权利要求1所述的SVG文件快速解析方法,其特征在于,所述节点标签为不固定长度的字符串。
4.根据权利要求1所述的SVG文件快速解析方法,其特征在于,所述简单标识为数字、 字符、或固定长度字符串。
5.根据权利要求4所述的SVG文件快速解析方法,其特征在于,所述简单标识为整数。
6.根据权利要求1所述的SVG文件快速解析方法,其特征在于,所述映射关系表为哈希映射表;所述映射算法为“hash-map”算法。
7.根据权利要求1至6中任意一项所述的SVG文件快速解析方法,其特征在于,还包含以下步骤将SVG文件中的各种节点标签的属性标签分别与一简单标识相对应,建立属性标签和简单标识的映射关系表,并保存各简单标识对应的属性类别;解析所述SVG文件的过程中,在读取到属性标签时,通过映射算法从该属性标签与简单标识的映射关系表中找到该属性标签对应的简单标识;将该简单标识与所保存的各简单标识进行比较,确定该简单标识所对应的属性类别, 并为对象设置对应类别的属性。
8.—种SVG文件快速解析系统,其特征在于,包含存储模块,用于存储SVG文件中各种类别的节点标签与对应的简单标识的映射关系表;映射模块,用于在解析所述SVG文件的过程中,读取到节点标签时,通过映射算法从该映射关系表中找到该节点标签对应的简单标识;对象创建模块,用于根据该映射模块查找到的简单标识判断该节点标签所对应的对象类别,并创建对应类别的对象。
9.根据权利要求8所述的SVG文件快速解析系统,其特征在于,所述存储模块还用于存储各简单标识所对应的对象类别;所述对象创建模块将所述查找到的简单标识与各已有的简单标识进行对比,如果一致,则建立该简单标识对应的类别的对象。
10.根据权利要求8所述的SVG文件快速解析系统,其特征在于,所述节点标签为不固定长度的字符串;所述简单标识为数字、字符、或固定长度的字符串。
11.根据权利要求10所述的SVG文件快速解析系统,其特征在于,所述简单标识为整数。
12.根据权利要求8所述的SVG文件快速解析系统,其特征在于,所述映射关系表为哈希映射表;所述映射算法为“hash-map”算法。
13.根据权利要求8至12中任意一项所述的SVG文件快速解析系统,其特征在于, 所述存储模块还用于存储SVG文件中各种节点标签的属性标签与对应的简单标识的映射关系表;所述映射模块还用于在解析所述SVG文件的过程中,读取到属性标签时,通过映射算法从该属性标签与简单标识的映射关系表中找到该属性标签对应的简单标识;所述对象创建模块还用于根据该映射模块查找到的简单标识判断该属性标签所对应的属性类别,并为对象设置对应类别的属性。
全文摘要
本发明公开了一种SVG文件快速解析方法及系统,由于SVG文件中的节点标签一般由长度不固定的字符串构成,在文件的解析过程中需要进行大量节点标签的对比和辨识,字符串的对比速度相对较慢,使得辨识该节点标签的速度变慢,而本发明首先通过映射技术将字符串映射为简单标识(如数字、单个字符、或2位字符串),在解析SVG节点标签时,直接对简单标识进行对比,从而无需再逐一进行不固定长度的字符串的比较,数字或单个字符的比较速度相对不固定长度的字符串的比较速度而言要快很多,因此在SVG文件中含有大量节点标签的情况下,采用本发明可以明显提高SVG文件的解析速度。
文档编号G06F17/30GK102385604SQ20101027373
公开日2012年3月21日 申请日期2010年9月6日 优先权日2010年9月6日
发明者俞高宇, 张晓华, 林 吉 申请人:上海可鲁系统软件有限公司