首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析XML inOrder C++

解析XML inOrder C++
EN

Stack Overflow用户
提问于 2013-03-09 02:21:50
回答 1查看 591关注 0票数 0

这与我之前的一个问题有关。我正在尝试从xml文件构建一棵树。我计划遍历xml文件,从数据中创建对象,并按预定顺序和顺序创建对象的向量,这样我就可以构造树对象。我使用的xml文件比这个要密集得多(大约23层),但这里有一个布局示例:

代码语言:javascript
复制
<?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>

我的preorder和postorder方法。首先传入根节点"MyJournal“。

代码语言:javascript
复制
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() << " ";
    }

}

到目前为止,我可以遍历文件并以preorder和postorder方式获取对象,但我不知道如何按顺序获取数据,因为没有左指针或右指针来递归调用函数。有没有人能给我一些指导,告诉我该怎么做?以这种方式获取数据并成功构建树结构是可能的吗?谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2013-03-11 20:47:57

前遍历、后遍历和顺序遍历的概念仅适用于二叉树:每个节点最多有两个子节点的树。

XML数据(通常)不必遵循这一点:每个节点可以有任意数量的子节点。

如果您的XML文件必须以二叉树的形式存在,那么只需将第一个物种节点视为“左”,将它的兄弟节点(如果存在)视为“右”。

请注意,在这种情况下,循环遍历所有兄弟项没有任何意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15300711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档