多层嵌套数据解析方法和设备
技术领域
本发明涉及计算机领域,尤其涉及对多层嵌套数据,例如日志数据,进行解析。
背景技术
许多类型的计算系统和应用生成与该计算系统或应用的操作相关或由该计算系统或应用的操作引起的大量数据。这些大量数据能够被存储到日志数据中,如果需要分析系统或应用的行为或操作,则这些日志数据可以在稍后的时间段被审查。或者,这些数据可能涉及不同计算机或计算机系统之间的请求数据。服务器管理员和应用管理员可以通过学习和分析这些数据来获益。但是,收集和分析这些数据会是非常有挑战性的任务。
在日志处理和分析领域中,常规的日志分析工具在涉及由日志分析工具使用的日志解析器的构建时是非常低效的。日志解析器是理解如何解析日志内的条目的工具。常规地,日志解析器必须由既熟知待分析的日志数据的确切格式又熟练掌握将用来实现解析器的具体编程基础设施的人来手动构建。
当前的如日志数据的数据可能存在相互嵌套的多层对象,某层对象中可能存在进一步的对象,该进一步的对象可以作为当前层对象的属性值。对于这种相互嵌套的多个对象而言,需要技术人员花费大量时间和资源来构建解析器。
发明内容
期望提供一种能够对包含相互嵌套的多个对象的数据进行快速解析的方法和设备,解析后的数据便于被转换为例如标准JSON格式,以便被进一步标准化处理,例如获取对象中包括的属性名称及其值。
根据一个实施例,提供一种用于解析数据的方法,所述数据包括相互嵌套的多层对象,所述多层对象至少包括一组处于彼此相邻的层级的第一层对象和第二层对象,所述第一层对象包括一个或多个第一对象,所述第二层对象包括一个或多个第二对象,所述第一层对象中的至少一个第一对象中的每个第一对象被包括在所述第二层对象中的对应的第二对象中并且作为所述对应的第二对象的一个或多个属性值中的对应属性值,所述方法包括遍历所述数据,以识别所述多层对象中的每层对象并对每层对象中的每个对象进行标记;基于每个对象的标记确定所述对象的键;基于每个对象的一个或多个属性值或者属性和属性值对确定所述对象的值,其中,将每个所述第一层对象中的所述至少一个第一对象中的每个第一对象的键确定为对应的第二层对象中的应的第二对象的一个或多个属性值中的对应属性值;以及基于每个对象的键和值生成以键-值对形式表示的经解析的数据。
根据另一个实施例,提供一种用于解析数据的设备,所述数据包括相互嵌套的多层对象,所述多层对象至少包括一组处于彼此相邻的层级的第一层对象和第二层对象,所述第一层对象包括一个或多个第一对象,所述第二层对象包括一个或多个第二对象,所述第一层对象中的至少一个第一对象中的每个第一对象被包括在所述第二层对象中的对应的第二对象中并且作为所述对应的第二对象的一个或多个属性值中的对应属性值,所述设备包括标记单元,其被配置为遍历所述数据,以识别所述多层对象中的每个对象并对每个对象进行标记;确定单元,其被配置为基于每个对象的标记确定所述对象的键,并且基于每个对象的一个或多个属性值或者属性和属性值对确定所述对象的值,其中,将每个所述第一层对象中的所述至少一个第一对象中的每个第一对象的键确定为对应的第二层对象中的对应的第二对象的一个或多个属性值中的对应属性值;以及生成单元,其被配置为基于每个对象的键和值生成以键-值对形式表示的经解析的数据。
根据再一个实施例,提供一种机器可读介质,其包括程序代码,当所述程序代码被处理器执行时,执行根据本发明的各个实施例所述的方法。
根据再一个实施例,提供一种用于分析数据的系统,该系统包括接口,其被配置为接收所述数据;和根据本发明的各个实施例所述的用于解析所述数据的设备。
根据本发明的各个实施例,对具有相互嵌套的多个对象的数据实现了快速解析,便于将解析后的数据利用例如开源程序转换为例如标准JSON格式,以便被进一步标准化处理,例如获取对象中包括的属性名称及其值。
附图说明
图1示出了示例性的待解析的日志数据;
图2示出了根据一个实施例的用于解析数据的方法;
图3示出了根据一个实施例对图1所示的日志数据进行遍历和标记之后生成的经标记的日志数据;
图4示出了根据一个实施例确定的层级结构图;
图5示出了根据一个实施例生成的经解析的数据的一部分;
图6示出了根据一个实施例的用于解析数据的设备。
参照上述附图来描述本发明的各个方面和特征。通常采用相同或相似的附图标号来表示相同的部件。上述附图仅仅是示意性的,而非限制性的。在不脱离本发明的主旨的情况下,在上述附图中各个元件的尺寸、形状、标号、或者外观可以发生变化,而不被限制到仅仅说明书附图所示出的那样。
具体实施方式
以下将参照日志数据说明本发明的各个实施例。但是,应当理解,只要包含相互嵌套的多层对象的数据均可以使用本发明的各个实施例来解析。
图1示出了示例性的日志数据。该日志数据包括相互嵌套的多层对象,并且能够由根据本发明的各个实施例的解析方法来解析。具体来说,在Param=[…]的方括号中包括两个对象,分别是ProdQueryByProdMarkDBOrder[…]和ProductVOOptions[…],在ProdQueryByProdMarkDBOrder[…]中不包括进一步的对象,仅仅示出了包括多个属性和对应的具体属性值的属性和属性值对,与ProdQueryByProdMarkDBOrder[…]不同,在ProductVOOptions[…]中还包括进一步的对象ProductVOOptions[…]作为针对relProdOptions这一属性的属性值。由此可见,图1所示的日志数据从内向外包括三层对象,即:针对relProdOptions这一属性的属性值ProductVOOptions[…],ProdQueryByProdMarkDBOrder[…]和ProductVOOptions[…],和Param=[…]的方括号中的内容整体,这些对象存在相互嵌套的层级关系。
如图1所示的日志数据中,存在相互嵌套的多层对象,针对其中相邻的任意两层对象,可以定义所有内层对象为第一层对象,在该内层对象之外的一层对象为第二层对象,该第一层对象和第二层对象又分别可以包括一个或多个第一对象和第二对象。能够预期第一层对象中的至少一个第一对象被包括在对应的第二对象中,而其余第一对象则没有被包括在第二对象中。当然,第一层对象中的每个第一对象均被嵌套在对应的第二对象中也是可能的。还能够预期,第一层对象中多个第一对象被包括在同一个第二对象中的情况。当在第二层对象中的某些第二对象包括对应的第一对象时,该第一对象作为对应的第二对象包括的一个或多个属性值中的对应属性值。
例如,如图1所示,当针对relProdOptions这一属性的属性值ProductVOOptions[…]作为第一层对象中的一个第一对象时,ProductVOOptions[…]作为第二层对象中对应的第二对象;当ProdQueryByProdMarkDBOrder[…]和ProductVOOptions[…]整体作为第一层对象时,Param=[…]的方括号指代第二层对象。由此可见,该数据的每层对象可以存在一个或多个对象,可以将该数据的一个层级中的所有对象作为第一层对象,而将相邻的下一个层级中的所有对象作为第二层对象;第一层对象中的每个第一对象可能对应第二层对象中的不同的第二层对象。以下将使用第一层对象和第二层对象来指代在数据中处于彼此相邻的两个层级中的对象。
可以预期当数据仅仅包括两层对象时,这两层对象分别被定义为第一层对象和第二层对象。
还可以预期数据存在更多层对象,例如5层或6层对象的情况,这时,逐一地将数据中彼此相邻的任意两层对象确定为第一层对象和第二层对象,例如将最内层对象首先赋值为第一层对象,并且将紧接着最内层对象的外层对象确定为第二层对象,由此从最内层对象开始将逐层对象赋值为第一层对象,并确定与第一层对象相邻的对应的第二层对象,从而进行之后的处理。
图2示出了根据本发明的一个实施例用于解析数据的方法200。在210,接收待解析的数据,例如如图1所示的日志数据Param=[…],将数据转换为数组,以便于之后遍历该数据中的每个字符。在220,对该数据进行遍历,以识别多层对象中的每层对象,并对每层对象中的各个对象进行标记。具体来说,能够通过在数据中检测对象的标志符来识别不同的对象,进而基于对象的当前层级位置标记该对象以表示处于不同层的对象。对象的标志符是预先确定的,例如在图1中所示的“[”和“]”,由箭头指示。
在一个具体的实施例中,在遍历之前首先定义一个层级位置变量并为其初始赋值1。在遍历过程中,接收数据中的一个字符,判断接收的字符是否为表示对象的开始或结束的标志符,例如“[”和“]”,如果判断所接收的字符不是对象的标志符,则接收下一个字符,并进一步判断下一个字符是否为标志符。
如果判断所接收的字符表示对象的开始,如“[”,则判断之前是否遍历到过标志符。
如果之前没有遍历到过任何标志符,则确定检测到最外层对象的开始,基于层级位置变量对当前对象进行标记。例如能够通过在当前字符后插入“#当前层级位置变量”来标记该开始位置,之后接收下一个字符。
如果之前遍历到过标志符,并且确定之前遍历到的标志符表示对象的开始,如“[”,则确定当前遍历到的字符表示包括在对象中的对象的开始,这时,先使得当前层级位置变量加1,然后在当前字符后插入“#当前层级位置变量”来标记该开始位置,之后接收下一个字符。
如果之前遍历到过标志符,并且确定之前遍历到的标志符表示对象的结束,如“]”,则确定当前遍历到的对象是在同一层级中的新对象的开始,这时,当前层级位置变量不变,通过在当前字符后插入“#当前层级位置变量”来标记该对象的开始位置。
如果判断所接收的字符是表示对象的结束的标记符,如“]”,同样需要判断之前遍历到的标志符。
如果判断之前遍历到的标志符表示对象的开始,如“[”,则确定当前遍历到的字符表示对象的结束,这时,当前层级位置变量不变,在当前字符前插入“当前层级位置变量#”来标记该结束位置,之后接收下一个字符。
如果判断之前遍历到的标志符表示对象的结束,如“]”,则确定当前遍历到的字符表示外层对象的结束,这时,当前层级位置变量减一,在当前字符前插入“当前层级位置变量#”来标记该结束位置,之后接收下一个字符。
在上述实施例使用“当前层级位置变量”和“#”的组合来标记各层中的每个对象,但是这不是限制性的,也可以设计其他标记,只要这些标记能够表明当前层级位置即可,例如能够直接使用“当前层级位置变量”来标记各个对象。在上述实施例中加入“#”仅仅是为了表示之前或之后的数字表示当前层级位置,并且通过与层级位置组合的不同方式表示当前位置处于对象的开始或结束。能够以任何合适的符号替代“#”。
在如上所述遍历了数据中的每个字符之后,能够生成经标记的数据,在该经标记的数据中示出了该日志数据的层级结构。图3示出了根据上述实施例对如图1所示的日志数据Param=[…]进行遍历和标记之后生成的经标记的日志数据[paramContentConvertedString]=[…],其中由“#3……3#”,“#2……2#”,“#2……2#”和“#1……1#”标记出该日志数据的中每层对象中的每个对象,其中“#3……3#”表示最内层对象,“#2……2#”表示中间层对象,该中间层存在两个对象,“#1……1#”表示最外层对象。针对该日志数据,能够首先将最内层对象和中间层对象分别设定为第一层和第二层对象进行之后的处理,接着,将中间层对象和最外层对象分别设定为新的第一层和第二层对象进行重复之后的处理。具体的处理将结合230和240在之后进行描述。
在230,基于上述对象的标记,确定每个对象的键。在一个实施例中,能够基于如上所确定的当前层级位置和当前对象在当前层级中的编号来确定每个对象的键。例如由“#3……3#”所标记的针对relProdOptions这一属性的对象ProductVOOptions[…]的键能够被确定为“^30”,其中的符号“^”仅仅是为了表明之后的数字30表示当前对象的具体层级位置。相应地,图1所示的对象ProdQueryByProdMarkDBOrder[…]和ProductVOOptions[…]的键能够被分别确定为“^20”和“^21”,且最外层对象的键能够被确定为“^10”。虽然参照“^10”,“^20”,“^21”和“^30”描述了每个对象的键,可以理解,能够以其他符号表示每个对象的键,只要这些符号能够表示对象的不同层级和在每个层级中的位置即可。
在240,基于每个对象的一个或多个属性值或者属性和属性值对确定所述对象的值。通常情况下,每个对象均包括一个或多个属性和对应的一个或多个属性值,例如“markCode=6321”,其中的“markCode”是属性,而“6321”是针对该属性的属性值。该属性和属性值对能够以键值对的形式表示,在这种情况下,基于每个对象所包括的一个或多个属性和属性值对确定当前对象的值。当前对象的值能够用针对该对象的哈希表或者哈希图表示。某些情况下,在对象中可能仅仅示出属性值,而没有示出对应的属性,例如对于各个属性以及属性的顺序已经事先确定。在这种情况下,能够基于每个对象的一个或多个属性值确定所述对象的值。针对这种情况,以下所提到的属性和属性值对均可以替换为属性值,以实现数据的解析。
在240,为了确定每个对象的值,首先需要提取每个对象以及每个对象所包括的一个或多个属性和属性值对。可以设想逐层地提取对应对象的属性和属性值对。接收在220确定的经标记的数据,基于非贪婪的正则匹配规则从该经标记的数据中提取每个对象的一个或多个属性和属性值对。该正则匹配规则能够被预先定义。例如针对图3所示的经标记的数据,能够使用基于“[#当前层级位置……当前层级位置#]”的匹配规则来提取对应层中的每个对象的所有属性和属性值对。进一步,能够基于不同的属性和属性值对之间的分隔符,提取每个属性和属性值对,并且能够基于属性和对应的属性值之间的定界符,例如“=”,提取成对的属性和属性值,这样便于将所提取的每层对象的所有属性和属性值以多个键值对的形式表示,生成对应的哈希表或者哈希图,进一步便于之后在250的处理。
基于上述230和240中的处理,能够初步确定每个对象的键和对应的值。考虑到待解析的数据中存在具有相互嵌套关系的多个层级,即存在如上所述的多组处于相邻层级的第一层对象和第二层对象,第一层对象中的至少一个第一对象中的每个第一对象被包括在与该第一层对象相邻的第二层对象中的对应第二对象中,在根据本发明的实施例中,当在240确定了包括第一对象的对应二层对象的值时,能够使用该第一对象的键来代替该第一对象,作为对应的第二对象中与该第一对象对应的属性值,由此,能够表明第一对象和第二对象之间的层级关系。可以预期仅仅哪些被包括在第二层对象中的某个第二对象中的第一对象的键被如本发明的各个实施例所述的基于标记来确定。
在一个优选实施例中,能够同时实现上述230和240的处理。在220中已经对数据进行了标记之后,能够确定该数据的多个层级。能够对各层对象的标记依次排序,首先将处于最内层的对象确定为第一层对象,从最内层对象开始,逐层级地进行如下处理。
基于第一层对象中的每个第一对象的标记确定该第一对象的键。然后,基于预定义的非贪婪匹配规则从如图3所示的经标记的数据中提取每个第一对象。基于进一步预定义的非贪婪匹配规则,例如基于分隔符提取每个属性和属性值对,进一步基于定界符提取成对的属性和属性值。在一个实施例中,当针对某个属性的属性值为空时,可以赋值为null,优选地删除属性值为null的属性和属性值对。
所提取的当前对象的属性和属性值对,或者对应第一对象的哈希表或图,能够用于确定该第一对象的值。然后对于第一层对象中被包括在第二层对象中的对应第二对象中的第一对象,使用该第一对象的键,例如“^30”替换该第一对象,作为包括该第一对象的对应的第二对象的一个或多个属性值中的对应属性值,最后将在第二层对象确定为新的第一层对象。之后对新的第一层对象执行上述对于第一层对象的处理,直到确定第二层对象是最外层对象为止。
在240之后,能够确定每个对象的键和值,并且每个包括第一对象的第二对象的值均包括对应的第一对象的键作为该第二对象的一个或多个属性值中的对应属性值。
在一个实施例中,在240中确定了每个对象的键和值之后,能够基于由此确定的每个对象的键和值生成以键-值对形式表示的层级结构图。图4示出了根据一个实施例确定的如图1所示的日志数据的层级结构图,其中不仅示出了彼此嵌套的对象总数,“size=4”,还示出了每个对象的键“key”和对应的值“value”,如“^30”,“^21”,“^20”,“^10”和它们分别对应的值,其中基于哈希算法示出了该层级结构图。从该层级结构图能够清楚地确定如图1所示的日志数据中各个对象所处的层级,还能够确定互相嵌套的两层对象之间的关系,例如,由键“^10”表示的作为根节点的对象包括两个进一步的对象ProdQueryByProdMarkDBOrder和ProductVOOptions作为其属性值,其键分别是“^21”和“^20”。请注意,图4仅仅示出了该日志数据的层级结构图的一部分,有些部分被隐藏。这不妨碍本领域技术人员对本发明的实施例的理解。
在250,基于在240确定的每个对象的键和值以及提取的每个对象的一个或多个属性和属性值对,生成以键-值对形式表示的经解析的数据。
在一个实施例中,能够基于上述层级结构图以及所提取的每个对象的一个或多个属性和属性值对生成所述的经解析的数据。
具体来说,在上述层级结构图中,仅仅能够确定彼此相邻的两层对象之间的关系,这通过将第二层对象中第二对象的某个属性值表示为对应该属性值的第一对象的键来实现。根据该层级结构图,用户不知道包括在该第二对象中的第一对象所包括的具体属性和属性值对。
为了生成完整的经解析的数据,在250中,需要进一步将作为第二对象的属性值的第一对象的键替换为该第一对象的一个或多个属性和属性值对,直到将层级结构图中的所有作为属性值的第一对象的键均替换为具体的属性和属性值对为止,换言之,直到最内层对象的键被替换为它的具体属性和属性值对为止。图5示出了根据本发明的一个实施例生成的经解析的数据的一部分。从图3能够看出由键“^30”表示的第一对象包括在由“^21”表示的第二对象中作为对应“relProdOptions”这一属性的属性值。在图5所示的经解析的数据中,以第一对象的一个或多个属性和属性值对替换作为对应“relProdOptions”这一属性的属性值的键“^30”,在图5的方块中示出了替换后的内容。
任选地,在260,能够将该经解析的数据转换为标准化的JSON格式,以便于提取各个参数。
以上参照210-260描述了本发明的各实施例的方法,可以理解,上述的各个步骤能够被修改/变更/拆分/组合,只要能够按照需要解析数据即可。
图6示出了根据一个实施例的用于解析数据的设备10。该设备至少包括标记单元11,确定单元12和生成单元13。该设备10还能够包括接收单元(未示出),其接收待解析的数据;和输出单元(未示出),其输出经解析的数据。
标记单元11遍历待解析的数据,以识别每层对象并对每层对象中的每个对象进行标记。在一个实施例中,标记单元11标记每个对象,以生成经标记的数据。
确定单元12基于每个对象的标记确定该对象的键;并且基于每个对象的一个或多个属性和属性值对确定该对象的值,其中,将每个第一层对象中的至少一个第一对象中的每个第一对象的键确定为对应的第二对象的一个或多个属性值中的对应属性值。该至少一个第一对象中的每个第一对象均被包括在对应的第二对象中作为对应第二对象的一个或多个属性值中的对应属性值。通常,数据包括多层对象,多层对象至少包括处于彼此相邻的层级的第一层对象和第二层对象,第一层和第二层对象分别包括一个或多个第一对象和一个或多个第二对象。
在一个实施例中,确定单元12基于每个对象的键和值确定以键-值对形式表示的层级结构图。在进一步的实施例中,确定单元12基于经标记的数据将该数据的最内层对象确定为第一层对象;并且对第一层对象重复执行如下处理以确定层级结构图:基于第一层对象中每个第一对象的标记确定每个第一对象的键;提取该第一层对象中的每个第一对象的一个或多个属性和属性值对;基于所提取的第一层对象中的每个第一对象的一个或多个属性和属性值对,确定第一层对象中的每个第一对象的值;将第一层对象中的至少一个第一对象中的每个第一对象替换为第一对象的键,以作为与该第一对象对应的第二对象的一个或多个属性值中的对应属性值;并且,将第二层对象确定为新的第一层对象,重复上述对第一层对象的处理。
在一个实施例中,确定单元12基于非贪婪的正则匹配规则从经标记的数据提取每个对象的一个或多个属性和属性值对,并且基于所提取的每个对象的一个或多个属性和属性值对确定该对象的值。
生成单元13基于每个对象的键和值生成以键-值对形式表示的经解析的数据。在一个实施例中,生成单元13基于来自确定单元12的层级结构图以及每个对象所包含的一个或多个属性和属性值对生成经解析的数据。具体地,生成单元13基于所述层级结构图,针对每个第一对象以及对应的第二对象,将作为第二对象中的对应属性值的第一对象的键替换为第一对象的值。
以上参照图6所示的单元描述了本发明的实施例的设备,能够设计所示的各个单元分别实现在本发明的方法实施例中实现的各个步骤。上述各个单元能够被修改/变更/拆分/组合,只要能够按照需要实现对数据的解析即可。
可以理解,本发明的各个实施例的用于解析数据的设备中的各个单元的功能以及方法的流程能够由计算机程序/软件实现。这些软件能够被载入到数据处理器的工作存储器中,当运行时用于执行根据本发明的各实施例的方法。
本发明的示范性实施例覆盖以下两者:从一开始就创建/使用本发明的计算机程序/软件,以及借助于更新将已有程序/软件转为使用本发明的计算机程序/软件。
根据本发明另外的实施例,提供一种机器(如计算机)可读介质,例如CD-ROM,其中所述可读介质具有被存储在其上的计算机程序代码,该计算机程序代码当被执行时令计算机或处理器执行根据本发明的各实施例的方法。该机器可读介质例如是与其他硬件一起或作为其他硬件的部分供应的光学存储介质或固态介质。
也可以将用于执行根据本发明的各实施例的方法的计算机程序以其他形式发布,例如经由因特网或者其他有线或无线电信系统。计算机程序也可以被提供在诸如万维网的网络上,并且能够从这样的网络被下载到数据处理器的工作计算机中。
也可以理解,本发明的各个实施例的用于解析数据的设备中的各个单元以及方法的流程能够用在例如用于分析数据的系统中。该数据能够是日志数据或者在不同计算机系统或者网络之间的请求数据。用于分析数据的系统在一些实施例中被实施为基于云的体系架构和/或基于SaaS(软件即服务)体系架构。这意味着用于分析数据的系统能够作为被托管平台上的服务来提供日志分析功能,以使得需要该服务的每个客户不需要在客户自己的网络上单独安装和配置服务部件。用于分析数据的系统能够将如日志的数据分析服务提供给多个单独的客户,并且可以被缩放以便为任何数量的客户服务。
该用于分析数据的系统包括接口,其接收待分析的数据。这些数据例如是来自客户网络的日志数据。每个客户网络可以包括任何数量的主机。主机是客户网络内生成作为一个或多个日志文件的日志数据的计算平台。在主机内产生的原始日志数据可以源自任何产生日志的源。例如,原始日志数据可以源自数据库管理系统(DBMS)、数据库应用(DBApp)、中间件、操作系统、硬件部件或任何其它日志生成应用、部件或系统。在每个客户网络中提供一个或多个网关,以与用于分析数据的系统通信。
该用于分析数据的系统的接口,还能够与用户端设备进行通信,用户经由该用户端设备和接口与用于分析数据的系统通信。这种用户端设备的示例包括例如工作站、个人计算机、移动设备或远程计算终端。用户端设备包括用于向位于用户端设备的用户显示用户界面的显示设备,诸如显示器监视器。用户端设备还包括让用户提供对用于分析数据的系统的活动的操作控制的一个或多个输入设备。
用于分析数据的系统包括用户端设备处的用户可访问的功能,例如,其中用于分析数据的系统被实现为引擎、机制和/或模块(无论是硬件、软件还是硬件和软件的混合)的集合,以执行数据的分析。
必须指出,本发明的实施例是参考不同主题来描述的。尤其地,一些实施例是参考方法型权利要求来描述的,而其他实施例是参考设备型权利要求来描述的。然而,本领域技术人员将从以上和以下描述获悉,除非另外指明,除了属于一种类型的主题的特征的任意组合以外,涉及不同主题的特征之间的任意组合也被视为被本申请公开了。并且,能够组合全部特征,提供大于特征的简单加和的协同效应。
以上参照特定的实施例描述本发明,本领域技术人员应当理解,在不背离本发明的精神和基本特征的情况下,能够以各种方式来实现本发明的技术方案。具体的实施例仅仅是示意性的,而非限制性的。另外,这些实施例之间能够任意组合,来实现本发明的目的。本发明的保护范围由所附的权利要求书来定义。
说明书和权利要求中的“包括”一词不排除其它元件或步骤的存在。在说明书中说明或者在权利要求中记载的各个元件的功能也可以被分拆或组合,由对应的多个元件或单一元件来实现。