对于我的c ++类的项目,我应该解析和xml文件并从中构建二叉树。该文件比这个密集得多,但布局如下:
<?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>
我很难弄清楚如何解析这些数据,以便我可以构建一棵树。我以为我可以为每个分支使用递归,但我只能得到它来得到一个孩子。有人暗示使用队列将数据放入树结构中,但我不太确定如何使用队列遍历树的所有级别。我觉得递归是解析每个分支的数据的最简单方法,但我无法弄清楚如何正确实现递归方法。这是我尝试使用的方法。我先传入根节点:
void loop(xml_node<> *species)
{
Node t1 = *new Node();
xml_node<> * name_node = species->first_node("name");
if(name_node != 0)
{
t1.setName(name_node->value());
cout << name_node->value() << endl;
}
xml_node<> * child = species->first_node("species");
if(child != 0)
{
cout << child->first_node("name")->value() << endl;
if(child->first_node()->next_sibling() != 0)
{
loop(child->first_node()->next_sibling());
xml_node<> * child2 = child->next_sibling();
cout << child2->first_node()->value() << endl;
loop(child2->first_node()->next_sibling());
}
}
}
它只通过返回Sea Creature的每个节点的第一个子节点 鱼 旗鱼 陆地动物 哺乳动物 狗
我真的很感激任何正确方向的指针。谢谢!
答案 0 :(得分:3)
要覆盖此文件中的所有节点,您需要查看每个节点的 children 及其兄弟。你好像明白了。
您的递归方法对于接触孩子来说是一个可行的选择。它似乎工作。对loop
的每次递归调用都会更深入到孩子们的一个级别。 (谁告诉你使用“队列”可能意味着“堆栈”......并且递归隐式使用堆栈。调用堆栈。)
这是错过的兄弟姐妹。由于递归被用于深入到XML树中,这可能不会通过更多的递归来解决。
查看代码中的代码部分:
xml_node<> * child = species->first_node("species");
if(child != 0)
{
cout << child->first_node("name")->value() << endl;
这是您找到第一个兄弟姐妹的地方,例如"swordfish"
。
尝试将if
语句更改为循环,因此包含的逻辑将在所有兄弟节点上执行,而不是仅在第一个节点上执行。
答案 1 :(得分:0)
我知道这个问题已经回答了,但我只想提出一个有用的提示。
您可以使用堆栈/队列来解析此XML文件以构建您的&#34;树而不是使用递归。结构
如果你想坚持递归,请确保所有孩子都指向同一个父,否则树结构将是错误的。