一种具有父子层级结构检索数据的方法
技术领域
本发明属于信息检索技术领域,尤其涉及一种具有父子层级结构检索数据的方法。
背景技术
在很多通过具有父子层级结构关系的文档(如JSON文档、XML文档)来传输业务数据的场景中,用户定义了一些需要检索的数据,然后需要检索文档来获取这些的数据,以便达到某种业务监控的目的。
例如存在下述需求,在如下格式的XML文档中,提取学生的姓名、年龄、年级、班级、城市等信息:
<info>
<teacher grade="3" class="1">
<name>李四</name>
<age>28</age>
<city>重庆</city>
</teacher>
<student grade="3" class="1">
<name>张三</name>
<age>8</age>
<city>成都</city>
</student>
<other1>
</other1>
<other2>
</other2>
</info>
传统的检索方法(简称方法一),是在XML文档中进行逐一查找来获取这些数据。即在文档中按顺序查找info student name三个标签,获取到学生的姓名。以此类推,通过重新查找其它标签来获取到其它期望的数据。
另一种检索方法(简称方法二),是在检索前将姓名、年龄等数据在XML文档中的路径与其输出函数建立映射关系,如路径info-student-name对应输出函数outputStudentName,当检索到info student name三个标签时,查找到其对应的输出函数,即可通过输出函数获取到学生的姓名。
上述方法一,是在文档中进行逐一查找,当每个文档需要检索的数据足够多时,如在上述文档中还想获取学生的其它信息,不管这些信息在文档中是否存在,都需要进行查找后才能确定,这种逐一查找标签的方法,势必会存在性能低下的问题,无法满足实时业务监控的需求。
上述方法二,每次查找路径对应的输出函数时,都要将标签按照层级关系,顺序拼接成一个字符串,此时涉及到字符串的内存申请、拷贝、释放等问题。且每次查找都是一次字符串的查找过程,要在所有的映射关系中进行匹配。另外,当查找完info-student-name后,再查找info-student-age时,路径info-student存在重复查找的缺陷,以及,当查找info-teacher-name时,会查找失败,浪费了之前的字符串拼接耗时。当XML文档中标签层级足够多时,上述几种缺陷也会对检索效率造成足够的影响。
发明内容
本发明的目的在于克服现有技术中存在的上述问题,提供一种具有父子层级结构检索数据的方法,能够对文档的标签按需,进行二次检索,且在检索过程中无需拼接字符串,就能获取到所有期望的数据,提升单个文档的检索效率。
为实现上述目的,本发明采用的技术方案如下。
一种具有父子层级结构检索数据的方法,其特征在于:该方法包括以下步骤:
a.建立字典树,在系统中建立所需数据对应路径的字典树,所述字典树中具有多个标签层级,标签层级之间具有分隔号;
b.第一级检索,从字典树的根节点开始,检索数据的标签层级A,如果字典树中存在标签层级A,且标签层级A有内容为分隔号的子节点E,则标签层级A在字典树中存在有二级子节点F,将字典树中的该子节点E压栈,进行第二级检索;如果标签层级A没有内容为分隔号的子节点E,则标签层级A在字典树中不存在二级子节点F,此时标签层级A的子标签不需要检索,则检索同级,如果存在同级,返回第一级检索,如果不存在同级,则结束;
c.第二级检索,从步骤b中保存的字典树子节点E开始,检索数据的标签层级A的子标签为子标签层级B,即数据的第二层标签,如果字典树中存在子标签层级B,且子标签层级B有内容为分隔号的子节点M,则说明子标签层级B在字典树中存在二级子节点N,由于子标签层级B是标签层级A的子标签,当前检索的数据在字典树中存在三级子节点N,则将字典树中的该子节点M压栈,进行第三级检索;如果没有内容为分隔号的子节点M,则检索同级,存在同级,返回第二级检索,不存在同级,则将步骤b中保存的字典树子节点E出栈,回退到字典树的根节点,返回第一级检索;如果字典树中不存在子标签层级B,则检索同级,存在同级,返回第二级检索,不存在同级,则将步骤b中保存的字典树子节点E出栈,返回到字典树的根节点,返回第一级检索;
d. 第三级检索,从步骤c中保存的字典树子节点M开始,检索数据的子标签层级B的子标签为子标签层级C,即数据的第三层标签,如果字典树中存在子标签层级C,且子标签层级C在字典树中存在二级子节点,则说明当前检索的数据在字典树中存在四级子节点,进行第四级检索,不存在四级子节点,则检索同级,存在同级,返回第三级检索,不存在同级,则将步骤c中保存的字典树子节点M出栈,回退到字典树的子节点E,返回第二级检索;如果字典树中不存在子标签层级C,则检索同级,存在同级,返回第三级检索,不存在同级,则将步骤c中保存的字典树子节点M出栈,回退到字典树的子节点E,返回第二级检索;
e. 第n次检索,第四次检索后进行第n次检索,继续查找字典树中是否有其它的子节点,直到没有用户所需的数据,则数据解析完毕,其中n≥5。
在步骤a中,所述路径的结束节点设有标记,所述标记绑定对应的多个输出函数。
所述数据包括XML、JSON和Excel文档。
所述分隔号为“-”、“、”或“.”隔离标签层级。
采用本发明的优点在于:
1、通过与字典树和栈相结合,在检索文档标签的过程中,每次检索子标签时,将字典树的当前查找节点压栈,检索完毕后出栈,通过这种实时保存字典树的当前查找节点的方式,避免从头开始查找,通过多次循环检索,实现了检索的递归过程,在递归过程中,将字典树中的位置压栈,递归结束后检索其同级节点时出栈,递归检索层级标签的时候,通过压栈和出栈能够获取当前查找节点,避免重复查找,解决了方法一中的逐一查找缺陷和方法二中字符串info-student重复查找的缺陷。
2、通过在字典树中查找标签时,标签本身即可判断,且当某个字符不同时可立即退出查找,解决了方法二中拼接字符串时内存申请、拷贝、释放的缺陷。
3、通过发现某标签在字典树中不存在时,意味着此标签及其子标签都不是需要检索的标签,此时可直接跳过此标签,解决了方法二中浪费查找info-teacher-name的缺陷。
4、通过整个文档的解析过程中,只需对标签按检索一次,即可完成所有数据的检索,解决了方法一中的逐一查找缺陷。
5、通过标记绑定对应的多个输出函数可以对应多个信息,便于查询更多的信息。
6、通过XML、JSON和Excel文档使用,应用范围广。
7、通过符号用于分隔号,便于观察标签层级之前的隔离点。
附图说明
图1为本发明流程示意图。
图2为本发明XML文档示意图。
具体实施方式
下面结合附图对本发明做进一步的说明。
实施例1
如图1所示,一种具有父子层级结构检索数据的方法,其特征在于:该方法包括以下步骤:
a.建立字典树,在系统中建立所需数据对应路径的字典树,所述字典树中具有多个标签层级,标签层级之间具有分隔号;
b.第一级检索,从字典树的根节点开始,检索数据的标签层级A,如果字典树中存在标签层级A,且标签层级A有内容为分隔号的子节点E,则标签层级A在字典树中存在有二级子节点F,将字典树中的该子节点E压栈,进行第二级检索;如果标签层级A没有内容为分隔号的子节点E,则标签层级A在字典树中不存在二级子节点F,此时标签层级A的子标签不需要检索,则检索同级,如果存在同级,返回第一级检索,如果不存在同级,则结束;
c.第二级检索,从步骤b中保存的字典树子节点E开始,检索数据的标签层级A的子标签为子标签层级B,即数据的第二层标签,如果字典树中存在子标签层级B,且子标签层级B有内容为分隔号的子节点M,则说明子标签层级B在字典树中存在二级子节点N,由于子标签层级B是标签层级A的子标签,当前检索的数据在字典树中存在三级子节点N,则将字典树中的该子节点M压栈,进行第三级检索;如果没有内容为分隔号的子节点M,则检索同级,存在同级,返回第二级检索,不存在同级,则将步骤b中保存的字典树子节点E出栈,回退到字典树的根节点,返回第一级检索;如果字典树中不存在子标签层级B,则检索同级,存在同级,返回第二级检索,不存在同级,则将步骤b中保存的字典树子节点E出栈,返回到字典树的根节点,返回第一级检索;
d. 第三级检索,从步骤c中保存的字典树子节点M开始,检索数据的子标签层级B的子标签为子标签层级C,即数据的第三层标签,如果字典树中存在子标签层级C,且子标签层级C在字典树中存在二级子节点,则说明当前检索的数据在字典树中存在四级子节点,进行第四级检索,不存在四级子节点,则检索同级,存在同级,返回第三级检索,不存在同级,则将步骤c中保存的字典树子节点M出栈,回退到字典树的子节点E,返回第二级检索;如果字典树中不存在子标签层级C,则检索同级,存在同级,返回第三级检索,不存在同级,则将步骤c中保存的字典树子节点M出栈,回退到字典树的子节点E,返回第二级检索;
e. 第n次检索,第四次检索后进行第n次检索,继续查找字典树中是否有其它的子节点,直到没有用户所需的数据,则数据解析完毕,其中n≥5。
在步骤a中,所述路径的结束节点设有标记,所述标记绑定对应的多个输出函数。
所述数据包括XML、JSON和Excel文档。
所述分隔号为“-”、“、”或“.”隔离标签层级。
采用本发明的优点在于:
通过与字典树和栈相结合,在检索文档标签的过程中,每次检索子标签时,将字典树的当前查找节点压栈,检索完毕后出栈,通过这种实时保存字典树的当前查找节点的方式,避免从头开始查找,通过多次循环检索,实现了检索的递归过程,在递归过程中,将字典树中的位置压栈,递归结束后检索其同级节点时出栈,递归检索层级标签的时候,通过压栈和出栈能够获取当前查找节点,避免重复查找,解决了方法一中的逐一查找缺陷和方法二中字符串info-student重复查找的缺陷。
通过在字典树中查找标签时,标签本身即可判断,且当某个字符不同时可立即退出查找,解决了方法二中拼接字符串时内存申请、拷贝、释放的缺陷。
通过发现某标签在字典树中不存在时,意味着此标签及其子标签都不是需要检索的标签,此时可直接跳过此标签,解决了方法二中浪费查找info-teacher-name的缺陷。
通过整个文档的解析过程中,只需对标签按检索一次,即可完成所有数据的检索,解决了方法一中的逐一查找缺陷。
通过标记绑定对应的多个输出函数可以对应多个信息,便于查询更多的信息。
通过XML、JSON和Excel文档使用,应用范围广。
通过符号用于分隔号,便于观察标签层级之前的隔离点。
以述格式的XML文档和需求为例,在检索前,建立所需数据对应路径的字典树,各标签层级之间以横杠符号“-”分隔,如图2所示,
第一步:每一个每个路径的结束节点设为特殊标记,如图2中的具有下划线的“name”、“age”、“grade”、“class”和“city”,表示需要输出数据,并为其绑定对应的输出函数,如“name”对应的输出函数为“outputName”、“age”对应的输出函数为“outputAge”,“class” 和“city”对应的输出函数为“outputClass”和“outputCity”;
第二步:检索第一级标签层级info时,查找字典树,发现在字典树中存在,且存在内容为标签分隔符的子节点E,说明info是需要检索的标签,将字典树的当前查找节点E压栈;
第三步:检索到第二级标签层级teacher,从字典树的查找栈顶节点E开始查找,其子节点F的字典为字符s,与t不相符,即可认为teacher查找失败,此时,意味着XML文档中的teacher标签不是需要检索的标签,甚至teacher标签的子标签也不是需要检索的标签,所以teacher标签及其子标签无需检索;
第四步:既然teacher标签层级及其子标签无需检索,则可以直接跳过,检索teacher的同级标签层级student,同第三步,从字典树的查找栈子节点E开始查找,发现在字典树中存在,且存在内容为标签分隔符的子节点M,说明student是需要检索的标签层级,将字典树的当前查找子节点M压栈;
第五步:检索到student标签层级的属性grade,从字典树的查找栈子节点M开始查找,发现在字典树中存在,且此路径存在输出标记,通过其绑定的输出函数,即可输出学生的年级信息;
第六步:依次检索下去,即可获取到所有需要的学生信息;
第七步:标签层级student及其子标签检索完成后,检索其相对应的标签层级other1,此时将字典树的查找栈子节点M出栈,得到当前查找子节点E,与第三步查找标签teacher一样,从字典树的查找栈顶子节点E开始查找,发现other1并不是需要检索的标签,直接跳过检索;依次类推,直到XML解析完毕。
以上所述实施例仅表达了本申请的具体实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请保护范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请技术方案构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。