Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将树结构解析为关系型数据存储_Java_Algorithm_Parsing_Serialization - Fatal编程技术网

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

Java 将树结构解析为关系型数据存储,java,algorithm,parsing,serialization,Java,Algorithm,Parsing,Serialization,是否有人能帮助我实现这一点,或者至少是用于实现这一点的算法 我试图做的是将层次/树结构文件解析为关系存储。下面我将用一个例子进一步解释 这是一个示例源文件,就本问题而言,只是一个简单/不现实的示例 <title text=“title1"> <comment id=“comment1"> <data> this is part of comment one</data> <data> this i

是否有人能帮助我实现这一点,或者至少是用于实现这一点的算法

我试图做的是将层次/树结构文件解析为关系存储。下面我将用一个例子进一步解释

这是一个示例源文件,就本问题而言,只是一个简单/不现实的示例

<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>
为了实现这一点,假设我可以用下面的方式指定关系模式,使用可以在源文件上计算的xpath表达式

attribute1: title   =  /title/@title
attribute2: comment =  /title/comment/@id
attribute3: data    =  /title/comment/data/text()
建议的数据结构:

  • 结果集是一个
    列表(其中:每个映射表示一行)
  • 架构是一个
    映射
    (其中:我们映射属性名-->路径表达式)
  • 源文件,一些
    DOM文档

我不确定您是在问如何实现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)
}
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"
例如,如果要在顶部的XML文档上跟踪此内容,可能会出现以下情况:

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)
}
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"
这正是你想要的


希望这有帮助!如果我误解了你的问题,请告诉我

您可以使用如下内容:
HashMap
我不确定您在问什么-这将是存储它的一种方式。存储后,您希望如何使用它?问题基本上是,如何实现解析器,即给定任意源文件和模式映射,如何转换为关系样式存储,如图所示。您可以使用向量作为ResultSet数据结构。内部向量是列,外部向量是行。好的,谢谢,但我仍然坚持使用解析/转换算法,所以如果有人能提出建议,那就好了……谢谢,你肯定理解了我的问题,尽管我可能忘了提到xml/树文件可能还包含其他数据,与属性集无关。所以在这种情况下,我们需要遍历给定的属性集,而不是整个xml文件?!我也在用Java编写代码,所以如果有人能推荐一个完美的Java解决方案,顺便说一句,您的问题似乎属于对象关系映射(ORM)范畴。例如,Hibernate具有将xml文件转换为SQL数据库表的功能。尝试在hibernate源代码中搜索执行hbm.xml到db转换的部分。