Разбор древовидной структуры в хранилище данных в реляционном стиле - PullRequest
3 голосов
/ 24 августа 2011

Может ли кто-нибудь помочь с тем, как я мог бы реализовать это, или хотя бы алгоритм для этого.

Я пытаюсь проанализировать файл иерархической / древовидной структуры в хранилище отношений.,Я объясню далее ниже, с примером.

Это пример исходного файла, просто простой / нереалистичный пример для целей этого вопроса.

<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()

Рекомендуемые структуры данных:

  • ResultSet - это List<Map<String,String>> (где: каждая карта представляетодна строка)
  • Схема представляет собой Map<String,String> (где: мы сопоставляем имя-атрибута -> выражение пути)
  • Исходный файл, некоторые DOM Document

1 Ответ

0 голосов
/ 25 августа 2011

Я не уверен, спрашиваете ли вы, как реализовать сам синтаксический анализатор 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"

Это именно то, что вы хотите.

Надеюсь, это поможет!Дайте мне знать, если я неверно истолковал ваш вопрос!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...