C++ 以C+顺序解析XML+;

C++ 以C+顺序解析XML+;,c++,recursion,binary-tree,rapidxml,C++,Recursion,Binary Tree,Rapidxml,这与我之前的一个问题有关。我正在尝试从xml文件构建一棵树。我计划遍历xml文件,从数据中创建对象,并在preorder和inoorder中创建对象向量,以便构建树对象。我使用的xml文件比这个密度大得多(大约23个级别),但下面是一个布局示例: <?xml version="1.0" encoding="utf-8"?> <MyJournal> <species> <name>Sea Creature</name&g

这与我之前的一个问题有关。我正在尝试从xml文件构建一棵树。我计划遍历xml文件,从数据中创建对象,并在preorder和inoorder中创建对象向量,以便构建树对象。我使用的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() << " ";
    }

}
void preOrder(xml_node*species)//添加到左节点
{
节点t1=*新节点();
xml_节点*名称_节点=物种->第一个_节点(“名称”);
//如果名称有值,请将节点的名称设置为此名称
if(name_node!=0)
{
t1.setName(name_node->value());
无法下一个兄弟姐妹()
{
loop3(子节点);//将这些添加到右节点
}
xml_节点*名称_节点=物种->第一个_节点(“名称”);
if(name_node!=0)
{
t1.setName(name_node->value());

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

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

如果必须将XML文件解释为二叉树,那么只需将第一个物种节点视为“左”节点,将其兄弟节点(如果存在)视为“右”

请注意,在这种情况下,通过所有兄弟姐妹的循环没有任何意义