一种过滤标记语言中非法标签的方法转让专利

申请号 : CN200710032441.X

文献号 : CN101458683B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郭华廖建华庞恩林胡胜发

申请人 : 安凯(广州)微电子技术有限公司

摘要 :

本发明公开了一种过滤标记语言中非法标签的方法,包括以下步骤:1、从标签构成的输入数据流中记录下:当前正要解析的标签的位置;上一个解析过的标签的位置;所有尚未解析到其结束标签的起始标签;且在解析的过程中,不断更新上述三个记录信息;2,从标签构成的输入数据流读入第一个非注释的、合法的标签,记为curTag,作为递归函数的输入参数,进行递归解析过程;3,在基于递归的标记语言解析过程中,利用步骤1所记录的信息,采用忽略或虚拟的容错机制,识别并过滤非法标签。本发明不会因为网页中存在错误标签而中断解析过程,从而提高了浏览器的鲁棒性,也增强了用户的浏览舒适度。

权利要求 :

1.一种过滤标记语言中非法标签的方法,其特征在于包括以下步骤:

步骤1,从标签构成的输入数据流中记录下:(1)当前正要解析的标签的位置;(2)上一个解析过的标签的位置;(3)所有尚未解析到其结束标签的开始标签;且在解析的过程中,不断更新上述(1)至(3)记录信息;

步骤2,从标签构成的输入数据流读入第一个非注释的、合法的标签,记为curTag,作为递归函数的输入参数,进行递归解析过程;

步骤3,在递归的标记语言解析过程中,利用步骤1所记录的信息,采用忽略或虚拟的容错机制,识别并过滤非法标签,所述忽略或虚拟的容错机制的处理过程为:若读入的下一个标签nextTag是标记语言中未定义的标签,则认为解析出错并调用容错机制一,忽略标记语言中未定义的标签,从输入数据流读入下一个标签;若读入的下一个标签nextTag是之前由步骤1记录的开始标签的结束标签,则回退数据流,把步骤1记录的上一个解析过的标签的位置的值赋给步骤1记录的当前正要解析的标签的位置,使得下一次读到的标签值等于当前的nextTag值,本次递归结束;若读入的下一个标签nextTag是之前无开始标签的结束标签,则忽略它,从输入数据流读入下一个标签;若读入的下一个标签nextTag为空,则本次递归结束;所述容错机制一为:忽略标记语言中未定义的标签,从输入数据流读入下一个标签。

2.根据权利要求1所述的过滤标记语言中非法标签的方法,其特征在于,递归的标记语言解析过程如下:(a)步骤2中读入的第一个非注释的、合法的标签curTag为递归函数的输入参数,(b)存储curTag的名称和属性于特定的数据结构,(c)从输入数据流读入下一个标签,记为nextTag,若输入数据流已经结束,则nextTag为空,(d)若读入的下一个标签nextTag是开始标签,则将nextTag的值赋给curTag,回到(c)开始新一次递归,(e)若读入的下一个标签nextTag是curTag的结束标签,则本次递归结束,(f)若读入的下一个标签nextTag是标记语言中未定义的标签,则认为解析出错并调用容错机制一,所述容错机制一为:忽略标记语言中未定义的标签,跳 回步骤(c);

(g)若读入的下一个标签nextTag是其它结束标签,或nextTag为空,认为解析出错并调用容错机制二;所述容错机制二为:(1)若nextTag是之前由步骤1记录的开始标签的结束标签,则回退输入数据流,把步骤1记录的上一个解析过的标签的位置的值赋给步骤1记录的当前正要解析的标签的位置,使得下一次读到的标签值等于当前的nextTag值,本次递归结束;

(2)若nextTag是之前无开始标签的结束标签,则忽略它,并跳回步骤(c);

(3)若nextTag为空,则本次递归结束;

(h)最终的解析结果存储在步骤(b)每次访问的数据结构中。

说明书 :

一种过滤标记语言中非法标签的方法

技术领域

[0001] 本发明涉及一种过滤标记语言(如HTML,XHTML,WML等)中非法标签的方法,适用于基于嵌入式微浏览器的标记语言的容错解析。

背景技术

[0002] 标记语言即标准通用标记语言SGML(Standard Generalized MarkupLanguage),由1986年发布的信息管理方面的国际标准(ISO 8879)定义。SGML的主要目的是定义一种使用标签来表示数据的标记语言的语法。
[0003] 标签由包围在一个小于号(<)和一个大于号(>)之间的文本组成,例如。起始标签(start tag)表示一个特定区域的开始,例如;结束标签(end tag)定义了一个区域的结束,除了在小于号之后紧跟着一个斜线(/)外,和起始标签基本一样,例如。SGML还定义了标签的属性(attribute),它们是定义在小于号和大于号之间的值,例如中,标签img包含名称是src的属性,其值为″picture.jpg″。
[0004] SGML语言由于其规范性、可移植性等特点,非常适用于Web数据描述。故在其基础上衍生出一些著名的固定标签集的网页语言,如WWW的页面规范HTML,WAP2.0的页面规范XHTML,WAP1.2的页面规范WML;以及可扩展的标记语言,如XML。
[0005] 普通浏览器的标记语言的解析,特别是嵌入式微浏览器,一般缺少错误处理机制,当浏览非标准网页时,常因由一个标签的错误而停止整个解析过程,从而给用户造成浏览上的不便。

发明内容

[0006] 本发明的目的在于提供一种过滤标记语言中非法标签的方法,以便浏览器正常显示输出,从而提高浏览器,特别是嵌入式微浏览器的鲁棒性。
[0007] 为实现上述目的,本发明通过以下的技术措施来实现:一种过滤标记语言中非法标签的方法,包括以下步骤:
[0008] 步骤1,从标签构成的输入数据流中记录下:
[0009] (1)当前正要解析的标签的位置,
[0010] (2)上一个解析过的标签的位置,
[0011] (3)所有尚未解析到其结束标签的起始标签;
[0012] 且在解析的过程中,不断更新上述三个记录信息;
[0013] 步骤2,从标签构成的输入数据流读入第一个非注释的、合法的标签,记为curTag,作为递归函数的输入参数,进行递归解析过程;
[0014] 步骤3,在基于递归(或其等价非递归)的标记语言解析过程中,利用步骤1所记录的信息,采用忽略或虚拟的容错机制,识别并过滤非法标签。
[0015] 本发明的递归解析过程如下:
[0016] a)步骤2中读入的第一个非注释的、合法的标签curTag为递归函数的输入参数,[0017] b)存储curTag的名称和属性于特定的数据结构,
[0018] c)从输入数据流读入下一个标签,记为nextTag,若输入数据流已经结束,则nextTag为空,
[0019] d)若读入的下一个标签nextTag是开始标签,则将nextTag的值赋给curTag,回到(a)开始新一次递归,
[0020] e)若读入的下一个标签nextTag是curTag的结束标签,则本次递归结束,[0021] f)若读入的下一个标签nextTag是标记语言中未定义的标签,则认为解析出错并调用容错机制一,
[0022] g)若读入的下一个标签nextTag是其它结束标签,或nextTag为空,认为解析出错并调用容错机制二;
[0023] h)最终的解析结果存储在步骤(b)每次访问的数据结构中。
[0024] 本发明步骤(f)所述容错机制一为:忽略标记语言中未定义的标签,跳回步骤(c),从输入数据流读入下一个标签,记为nextTag。
[0025] 本发明步骤(g)所述容错机制二为:
[0026] (1)若nextTag之前有步骤1记录的开始标签的结束标签,则回退数据流,把步骤1记录的上一个解析过的标签的位置的值赋给步骤1记录的当前正要解析的标签的位置,使得下一次读到的标签值等于当前的nextTag值,本次递归结束;
[0027] (2)若nextTag是之前无开始标签的结束标签,则忽略它,并跳回步骤(c),从输入数据流读入下一个标签,记为nextTag;
[0028] (3)若nextTag为空,则本次递归结束。
[0029] 本发明递归解析(或其等价非递归)不会因为网页中存在错误标签而中断解析过程,这提高了浏览器从错误中恢复的能力,避免了当浏览非标准网页时,因一个标签的错误而停止整个网页解析,从而提高了浏览器的鲁棒性,也增强了用户的浏览舒适度。

附图说明

[0030] 图1是本发明的流程框图。

具体实施方式

[0031] 为了使本发明的目的、技术方案及其优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0032] 实施例1
[0033] 一种过滤标记语言中非法标签的方法,具体包括以下步骤:
[0034] 1、从标签构成的输入数据流中记录下:当前正要解析的标签的位置;上一个解析过的标签的位置;所有尚未解析到其结束标签的起始标签;且在解析的过程中,不断更新上述三个记录信息;
[0035] 2、从标签构成的输入数据流中读入的第一个非注释的、合法的标签curTag为递归函数的输入参数,
[0036] 3、存储curTag的名称和属性于特定的数据结构,
[0037] 4、从输入数据流读入下一个标签,记为nextTag,若输入数据流已经结束,则nextTag为空,
[0038] 5、若读入的下一个标签nextTag是开始标签,则将nextTag的值赋给curTag,回到步骤2开始新一次递归,
[0039] 6、若读入的下一个标签nextTag是curTag的结束标签,则本次递归结束,[0040] 7、若读入的下一个标签nextTag是标记语言中未定义的标签,则认为解析出错并调用容错机制一,忽略标记语言中未定义的标签,跳回步骤4;
[0041] 8、若读入的下一个标签nextTag之前有步骤1记录的开始标签的结束标签,则回退数据流,把步骤1记录的上一个解析过的标签的位置的值赋给步骤1记录的当前正要解析的标签的位置,使得下一次读到的标签值等于当前的nextTag值,本次递归结束;
[0042] 9、若读入的下一个标签nextTag之前无开始标签的结束标签,则忽略它,并跳回步骤4;
[0043] 10、若读入的下一个标签nextTag为空,则本次递归结束。
[0044] 上述最终的解析结果存储在步骤3每次访问的数据结构中。
[0045] 如输入标签流为:
[0046]
[0047]

[0048]
[0049]

[0050]
[0051] 该wml页面存在语法错误:标签为wml语言中未定义的标签。
[0052] 使用上述的10个步骤对该页面进行解析。在进行到步骤7时,nextTag为,是标记语言中未定义的标签,则跳转到步骤4,读入下一个标签

。故该错误标签被成功地过滤。
[0053] 实施例2
[0054] 如输入标签流为:
[0055]
[0056]

[0057]
[0058] 该wml页面存在语法错误:标签

缺少结束标签

[0059] 使用实施例1中的10个步骤对该页面进行解析。在进行到步骤8时,发现虽然不是

的结束标签,但它是之前出现过的开始标签的结束标签,故回退数据流,使得下一次读到的nextTag仍为,且本次递归结束。从而在

和之间虚拟地插入了一个

,使得解析可以继续成功地进行。
[0060] 实施例3
[0061] 如输入标签流为:
[0062]
[0063]

[0064]
[0065]

[0066]