1

对于我的 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());
        }
    }

}

它只通过每个节点的第一个子节点返回 海洋生物 鱼 箭鱼 陆地动物 哺乳动物 狗

我真的很感激任何正确方向的指示。谢谢!

4

2 回答 2

2

要覆盖此文件中的所有节点,您需要查看每个节点的节点及其兄弟节点。你似乎明白这一点。

您的递归方法是获取孩子的可行选择。它似乎正在工作。每个递归调用loop都会深入到子级。(谁告诉你使用“队列”可能意味着“堆栈”......并且递归隐式使用堆栈。调用堆栈。)

想念的是兄弟姐妹。并且由于递归被用于深入到 XML 树中,这可能不会通过更多的递归来解决。

查看代码的此代码部分:

xml_node<> * child = species->first_node("species");
if(child != 0)
{
    cout << child->first_node("name")->value() << endl;

这是您找到第一个兄弟姐妹的地方,例如"swordfish".

尝试将该if语句更改为循环,以便在所有兄弟节点上执行包含的逻辑,而不仅仅是第一个。

于 2013-03-07T17:09:52.603 回答
0

我知道这个问题已经得到解答,但我只想提供一个有用的提示。

您可以使用堆栈/队列来解析此 XML 文件来构建您的“树”结构,而不是使用递归。

如果要坚持递归,请确保所有子级都指向同一个父级,否则树结构将是错误的。

于 2013-03-13T19:10:45.393 回答