gpt4 book ai didi

java - 将树结构解析为关系型数据存储

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:25 24 4
gpt4 key购买 nike

是否有人能够帮助我实现这个,或者至少是用于此的算法。

我想做的是将一个层次结构/树结构文件解析为一个关系存储。我将在下面进一步解释,并举例说明。

这是一个示例源文件,只是针对此问题的一个简单/非现实示例。

<title text=“title1">
<comment id=“comment1">
<data> this is part of comment one</data>
<data> this is some more of comment one</data>
</comment>
<comment id=“comment2”>
<data> this is part of comment two</data>
<data> this is some more of comment two</data>
<data> this is even some more of comment two</data>
</comment>
</title>

所以这里主要要注意的是<comment>的个数, 和 <data> 的数量每个评论的元素可以是任意的。因此,鉴于上述情况,我想转变成类似的东西:

title     |   comment     |      data
------------------------------------------------------------------------
title1 comment1 this is some part of comment one
title1 comment1 this is some more of comment one
title1 comment2 this is part of comment two
title1 comment2 this is some more of comment two
title1 comment2 this is even some more of comment two

为了实现这一点,假设我可以使用可以在源文件上进行评估的 xpath 表达式,以下列方式指定关系模式。

attribute1: title   =  /title/@title
attribute2: comment = /title/comment/@id
attribute3: data = /title/comment/data/text()

建议的数据结构:

  • 结果集是 List<Map<String,String>> (其中:每个 map 代表一行)
  • 架构是 Map<String,String> (其中:我们映射属性名 --> 路径表达式)
  • 源文件,一些DOM Document

最佳答案

我不确定您是在问如何实现 XML 解析器本身,还是在给定 XML 解析树的情况下如何将其展平为层次结构。我猜您现在正在看后者(那里有许多优秀的 XML 解析器,我怀疑这是瓶颈),所以我将在这里回答。如果您真的对 XML 解析细节感兴趣,请告诉我,我可以更新答案。

我相信您想考虑的方式是对树进行递归下降。想法如下:您的命名系统由树中所有位于您上方的节点串联而成,后跟您自己的名字。鉴于此,您可以使用如下方式在树上运行递归 DFS:

FlattenXML(XMLDocument x) {
for each top-level XML node t:
RecFlattenTree(t, "");
}

RecFlattenTree(Tree t, String prefix) {
if t is a leaf with data d:
update the master table by adding (prefix, d) to the list of entries
else
for each child c of t, whose name is x:
RecFlattenTree(c, prefix + "/" + x)
}

例如,如果您要在顶部的 XML 文档上进行跟踪,它可能会像这样:

RecFlattenTree(title1, "/title1")
RecFlattenTree(comment1, "/title1/comment1")
RecFlattenTree(data node 1 , "/title1/comment1")
Add /title1/comment1/data, value = "this is some part of comment one"
RecFlattenTree(data node 2, "/title1/comment1")
Add /title1/comment2/data, value = "this is some more of comment one"
RecFlattenTree(comment2, "/title1/comment2")
RecFlattenTree(data node 1 , "/title1/comment2")
Add /title1/comment2/data, value = "this is part of comment two"
RecFlattenTree(data node 2, "/title1/comment2")
Add /title1/comment2/data, value = "this is more of comment two"
RecFlattenTree(data node 3, "/title1/comment2")
Add /title1/comment2/data, value = "this is even more of comment two"

最终生成列表

/title1/comment1/data, value = "this is some part of comment one"
/title1/comment1/data, value = "this is some more of comment one"
/title1/comment1/data, value = "this is part of comment two"
/title1/comment1/data, value = "this is more of comment two"
/title1/comment1/data, value = "this is even more of comment two"

这正是您想要的。

希望对您有所帮助!如果我误解了您的问题,请告诉我!

关于java - 将树结构解析为关系型数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com