本发明公开了一种过滤标记语言中非法标签的方法,包括以下步骤: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);
(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]
[0049]
[0050]
[0051] 该wml页面存在语法错误:标签
为wml语言中未定义的标签。[0052] 使用上述的10个步骤对该页面进行解析。在进行到步骤7时,nextTag为
,是标记语言中未定义的标签,则跳转到步骤4,读入下一个标签。故该错误标签被成功地过滤。[0053] 实施例2
[0054] 如输入标签流为:
[0055]
[0057]
[0058] 该wml页面存在语法错误:标签
缺少结束标签
。
[0059] 使用实施例1中的10个步骤对该页面进行解析。在进行到步骤8时,发现虽然不是
的结束标签,但它是之前出现过的开始标签的结束标签,故回退数据流,使得下一次读到的nextTag仍为,且本次递归结束。从而在
和之间虚拟地插入了一个
,使得解析可以继续成功地进行。
[0060] 实施例3
[0061] 如输入标签流为:
[0062]
[0064]
[0065]
[0066]
[0067] 该wml页面存在语法错误:标签
[0068] 使用实施例1中的10个步骤对该页面进行解析。在进行到步骤9时,发现不是<p>的结束标签,且之前没有开始标签
出现,故忽略该标签,并跳转到步骤4,继续读入下一个标签,从而使得解析可以继续成功地进行。[0069] 实施例4
[0070] 如输入标签流为:
[0071]
[0073]
[0074] 该wml页面存在语法错误:页面最后缺少结束标签。
[0075] 使用实施例1中的10个步骤对该页面进行解析。在进行到步骤10时,发现nextTag为空(因为输入数据流已经结束),则结束本次递归。从而在最后虚拟地插入了一个,使得解析可以继续成功地进行。
[0076] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的包保护范围之内。