Я не уверен, спрашиваете ли вы, как реализовать сам синтаксический анализатор 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"
Это именно то, что вы хотите.
Надеюсь, это поможет!Дайте мне знать, если я неверно истолковал ваш вопрос!