Это связано с одним из моих предыдущих вопросов. Я пытаюсь построить дерево из XML-файла. Я планирую просмотреть XML-файл и создать объекты из данных, а также создать вектор объектов в предварительном порядке и порядке, чтобы я мог построить объект дерева. XML-файл, который я использую, гораздо плотнее (примерно 23 уровня или около того), но вот пример макета:
<?xml version="1.0" encoding="utf-8"?>
<MyJournal>
<species>
<name>Sea Creature</name>
<species>
<name>Fish</name>
<species>
<name>swordfish</name>
</species>
<species>
<name>grouper</name>
</species>
</species>
<species>
<name>Mammal</name>
<species>
<name>dolphin</name>
</species>
<species>
<name>whale</name>
</species>
</species>
</species>
<species>
<name>Land animal</name>
<species>
<name>Mammal</name>
<species>
<name>dog</name>
</species>
<species>
<name>cat</name>
</species>
</species>
<species>
<name>Bird</name>
<species>
<name>blue jay</name>
</species>
<species>
<name>robin</name>
</species>
</species>
</species>
</MyJournal>
Мои методы предварительного и почтового заказа. Корневой узел «MyJournal» передается первым.
void preOrder(xml_node<> *species) // add to left node
{
Node t1 = *new Node();
xml_node<> * name_node = species->first_node("name");
//If there is a value for name, set the name of the node to this name
if(name_node != 0)
{
t1.setName(name_node->value());
cout << t1.getName() << " ";
}
//If there is no name node, print the default name which is "ROOT"if(name_node == 0)
{
cout << t1.getName() << " ";
}
for (xml_node<> * child_node = species->first_node("species"); child_node; child_node = child_node->next_sibling())
{
loop2(child_node); // add these to right node
}
}
void postOrder(xml_node<> *species) // add to left node
{
Node t1 = *new Node();
for (xml_node<> * child_node = species->first_node("species"); child_node; child_node = child_node->next_sibling())
{
loop3(child_node); // add these to right node
}
xml_node<> * name_node = species->first_node("name");
if(name_node != 0)
{
t1.setName(name_node->value());
cout << t1.getName() << " ";
}
if(name_node == 0)
{
cout << t1.getName() << " ";
}
}
Пока что я могу просмотреть файл и получить объекты в предварительном порядке и после заказа, но я не могу понять, как получить данные в порядке, поскольку нет левого или правого указателей для рекурсивного вызова функции. Кто-нибудь может дать мне несколько советов, как это сделать? Можно ли получить данные таким образом и успешно построить древовидную структуру? Спасибо за любую помощь!
Концепции обхода до, после и по порядку применимы только к двоичным деревьям: деревьям, в которых каждый узел имеет не более двух дочерних элементов.
Данные XML (в общем) не должны следовать этому: каждый узел может иметь любое количество дочерних элементов.
Если ваш XML-файл должен интерпретироваться как бинарное дерево, то просто обработайте первый видовой узел как «левый», а его родственный (если он присутствует) как «правый».
Обратите внимание, что в этом случае ваши циклы через всех братьев и сестер не имеют никакого смысла.
Других решений пока нет …