c++ - 使用 RapidXML 和 C++ 从 XML 文件构建树

标签 c++ recursion xml-parsing binary-tree rapidxml

对于我的 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>

我很难弄清楚如何解析这些数据以便构建树。我在想我可以对每个分支使用递归,但我只能让它得到一个 child 。有人暗示要使用队列将数据放入树结构中,但我不太确定如何使用队列遍历树的所有级别。我觉得递归是解析每个分支数据的最简单方法,但我就是想不通如何正确实现递归方法。这是我尝试使用的方法。我先传入了根节点:

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 的每个节点的第一个子节点 鱼 旗鱼 陆地动物 哺乳动物 狗

我非常感谢任何指向正确方向的指示。谢谢!

最佳答案

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

您的递归方法是获取子项的可行选择。它似乎在工作。对 loop 的每次递归调用都深入到子级中。 (无论谁告诉您使用“队列”,都可能意味着“堆栈”……递归隐式使用堆栈。调用堆栈。)

这是被想念的 sibling 。由于递归被用于深入 XML 树,这可能无法通过更多递归来解决。

查看您的代码的这段代码:

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

这是您找到第一个 sibling 的地方,例如 "swordfish"

尝试将 if 语句更改为循环,这样包含的逻辑将在所有 sibling 上执行,而不仅仅是第一个 sibling 。

关于c++ - 使用 RapidXML 和 C++ 从 XML 文件构建树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15276796/

相关文章:

c++ - 选酒动态规划

java - 尝试解析 xml 但出现 malformedURLException

c++ - 如何在标准 GUI 应用程序中以 Qt3D 呈现?

c++ - 如何从 begin() 和 end() 中实现 cbegin() 和 cend()?

c++ - C 预处理器作为语言创建工具的长度/限制是什么?我在哪里可以了解更多关于这些的信息?

c++ - 如何使用 DOM xerces c++.. 在 xml 文件中查找元素名称?

java - 修改xml中特定标签的值

c++ - 如何在测试系统中自动注册测试用例?

python - 现代艺术中的 CP Python 逻辑混淆(Bronze USACO 2017 美国公开赛第 3 页)

c++ - 使用同一泰勒级数评估log(1 + x)的递归