公开/公告号CN101458683A
专利类型发明专利
公开/公告日2009-06-17
原文格式PDF
申请/专利权人 安凯(广州)软件技术有限公司;
申请/专利号CN200710032441.X
申请日2007-12-14
分类号G06F17/30;
代理机构广州知友专利商标代理有限公司;
代理人宣国华
地址 510663 广东省广州市天河科技园软件园高唐新建区高普路1033号6楼
入库时间 2023-12-17 22:10:28
法律状态公告日
法律状态信息
法律状态
2011-04-06
授权
授权
2009-08-12
实质审查的生效
实质审查的生效
2009-06-17
公开
公开
技术领域
本发明涉及一种过滤标记语言(如HTML,XHTML,WML等)中非法标签的方法,适用于基于嵌入式微浏览器的标记语言的容错解析。
背景技术
标记语言即标准通用标记语言SGML(Standard Generalized MarkupLanguage),由1986年发布的信息管理方面的国际标准(ISO8879)定义。SGML的主要目的是定义一种使用标签来表示数据的标记语言的语法。
标签由包围在一个小于号(<)和一个大于号(>)之间的文本组成,例如<tag>。起始标签(start tag)表示一个特定区域的开始,例如<start>;结束标签(end tag)定义了一个区域的结束,除了在小于号之后紧跟着一个斜线(/)外,和起始标签基本一样,例如</end>。SGML还定义了标签的属性(attribute),它们是定义在小于号和大于号之间的值,例如<img src="picture.jpg">中,标签img包含名称是src的属性,其值为"picture.jpg"。
SGML语言由于其规范性、可移植性等特点,非常适用于Web数据描述。故在其基础上衍生出一些著名的固定标签集的网页语言,如WWW的页面规范HTML,WAP2.0的页面规范XHTML,WAP1.2的页面规范WML;以及可扩展的标记语言,如XML。
普通浏览器的标记语言的解析,特别是嵌入式微浏览器,一般缺少错误处理机制,当浏览非标准网页时,常因由一个标签的错误而停止整个解析过程,从而给用户造成浏览上的不便。
发明内容
本发明的目的在于提供一种过滤标记语言中非法标签的方法,以便浏览器正常显示输出,从而提高浏览器,特别是嵌入式微浏览器的鲁棒性。
为实现上述目的,本发明通过以下的技术措施来实现:一种过滤标记语言中非法标签的方法,包括以下步骤:
步骤1,从标签构成的输入数据流中记录下:
(1)当前正要解析的标签的位置,
(2)上一个解析过的标签的位置,
(3)所有尚未解析到其结束标签的起始标签;
且在解析的过程中,不断更新上述三个记录信息;
步骤2,从标签构成的输入数据流读入第一个非注释的、合法的标签,记为curTag,作为递归函数的输入参数,进行递归解析过程;
步骤3,在基于递归(或其等价非递归)的标记语言解析过程中,利用步骤1所记录的信息,采用忽略或虚拟的容错机制,识别并过滤非法标签。
本发明的递归解析过程如下:
a)步骤2中读入的第一个非注释的、合法的标签curTag为递归函数的输入参数,
b)存储curTag的名称和属性于特定的数据结构,
c)从输入数据流读入下一个标签,记为nextTag,若输入数据流已经结束,则nextTag为空,
d)若读入的下一个标签nextTag是开始标签,则将nextTag的值赋给curTag,回到(a)开始新一次递归,
e)若读入的下一个标签nextTag是curTag的结束标签,则本次递归结束,
f)若读入的下一个标签nextTag是标记语言中未定义的标签,则认为解析出错并调用容错机制一,
g)若读入的下一个标签nextTag是其它结束标签,或nextTag为空,认为解析出错并调用容错机制二;
h)最终的解析结果存储在步骤(b)每次访问的数据结构中。
本发明步骤(f)所述容错机制一为:忽略标记语言中未定义的标签,跳回步骤(c),从输入数据流读入下一个标签,记为nextTag。
本发明步骤(g)所述容错机制二为:
(1)若nextTag之前有步骤1记录的开始标签的结束标签,则回退数据流,把步骤1记录的上一个解析过的标签的位置的值赋给步骤1记录的当前正要解析的标签的位置,使得下一次读到的标签值等于当前的nextTag值,本次递归结束;
(2)若nextTag是之前无开始标签的结束标签,则忽略它,并跳回步骤(c),从输入数据流读入下一个标签,记为nextTag;
(3)若nextTag为空,则本次递归结束。
本发明递归解析(或其等价非递归)不会因为网页中存在错误标签而中断解析过程,这提高了浏览器从错误中恢复的能力,避免了当浏览非标准网页时,因一个标签的错误而停止整个网页解析,从而提高了浏览器的鲁棒性,也增强了用户的浏览舒适度。
附图说明
图1是本发明的流程框图。
具体实施方式
为了使本发明的目的、技术方案及其优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
实施例1
一种过滤标记语言中非法标签的方法,具体包括以下步骤:
1、从标签构成的输入数据流中记录下:当前正要解析的标签的位置;上一个解析过的标签的位置;所有尚未解析到其结束标签的起始标签;且在解析的过程中,不断更新上述三个记录信息;
2、从标签构成的输入数据流中读入的第一个非注释的、合法的标签curTag为递归函数的输入参数,
3、存储curTag的名称和属性于特定的数据结构,
4、从输入数据流读入下一个标签,记为nextTag,若输入数据流已经结束,则nextTag为空,
5、若读入的下一个标签nextTag是开始标签,则将nextTag的值赋给curTag,回到步骤2开始新一次递归,
6、若读入的下一个标签nextTag是curTag的结束标签,则本次递归结束,
7、若读入的下一个标签nextTag是标记语言中未定义的标签,则认为解析出错并调用容错机制一,忽略标记语言中未定义的标签,跳回步骤4;
8、若读入的下一个标签nextTag之前有步骤1记录的开始标签的结束标签,则回退数据流,把步骤1记录的上一个解析过的标签的位置的值赋给步骤1记录的当前正要解析的标签的位置,使得下一次读到的标签值等于当前的nextTag值,本次递归结束;
9、若读入的下一个标签nextTag之前无开始标签的结束标签,则忽略它,并跳回步骤4;
10、若读入的下一个标签nextTag为空,则本次递归结束。
上述最终的解析结果存储在步骤3每次访问的数据结构中。
如输入标签流为:
<wml>
<p>
<abcdefg>
</p>
</wml>
该wml页面存在语法错误:标签<abcdefg>为wml语言中未定义的标签。
使用上述的10个步骤对该页面进行解析。在进行到步骤7时,nextTag为<abcdefg>,是标记语言中未定义的标签,则跳转到步骤4,读入下一个标签</p>。故该错误标签被成功地过滤。
实施例2
如输入标签流为:
<wml>
<p>
</wml>
该wml页面存在语法错误:标签<p>缺少结束标签</p>。
使用实施例1中的10个步骤对该页面进行解析。在进行到步骤8时,发现虽然</wml>不是<p>的结束标签,但它是之前出现过的开始标签<wml>的结束标签,故回退数据流,使得下一次读到的nextTag仍为</wml>,且本次递归结束。从而在<p>和</wml>之间虚拟地插入了一个</p>,使得解析可以继续成功地进行。
实施例3
如输入标签流为:
<wml>
<p>
</a>
</p>
</wml>
该wml页面存在语法错误:标签</a>没有相配对的开始标签。
使用实施例1中的10个步骤对该页面进行解析。在进行到步骤9时,发现</a>不是<p>的结束标签,且之前没有开始标签<a>出现,故忽略该标签,并跳转到步骤4,继续读入下一个标签</p>,从而使得解析可以继续成功地进行。
实施例4
如输入标签流为:
<wml>
<p>
</p>
该wml页面存在语法错误:页面最后缺少结束标签</wml>。
使用实施例1中的10个步骤对该页面进行解析。在进行到步骤10时,发现nextTag为空(因为输入数据流已经结束),则结束本次递归。从而在最后虚拟地插入了一个</wml>,使得解析可以继续成功地进行。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的包保护范围之内。
机译: 一种基于动态标记语言元素的基于标记语言的页面中动态内容的激活方法
机译: 一种基于动态标记语言元素的基于标记语言的页面中动态内容的激活方法
机译: Internet网络中扩展标记语言XML文档的处理,在该网络中,用户选择一种标记语言,并显示其功能列表,并且XML文档与Schema XML语言相关联