C++ 使用RapidXML和c++; 第一个_节点(“名称”); if(name_node!=0) { t1.setName(name_node->value()); cout value()第一个节点(“种类”); 如果(子项!=0) { cout first_node(“name”)->value()first_node()->next_sibling()!=0) { 循环(子节点->第一个节点()->下一个兄弟节点()); xml_node*child2=child->next_sibling(); cout first_node()->value()first_node()->next_sibling()); } } }

C++ 使用RapidXML和c++; 第一个_节点(“名称”); if(name_node!=0) { t1.setName(name_node->value()); cout value()第一个节点(“种类”); 如果(子项!=0) { cout first_node(“name”)->value()first_node()->next_sibling()!=0) { 循环(子节点->第一个节点()->下一个兄弟节点()); xml_node*child2=child->next_sibling(); cout first_node()->value()first_node()->next_sibling()); } } },c++,recursion,xml-parsing,binary-tree,rapidxml,C++,Recursion,Xml Parsing,Binary Tree,Rapidxml,我很难弄清楚如何解析这些数据,以便构建一棵树。我想我可以对每个分支使用递归,但我只能得到一个子分支。有人暗示使用队列将数据放入树结构中,但我不太确定如何使用队列遍历树的所有级别。我觉得递归是解析每个分支的数据的最简单方法,但我就是不知道如何正确地实现递归方法。这是我尝试使用的方法。我首先传入了根节点: void loop(xml_node<> *species) { Node t1 = *new Node(); xml_node<> * name_node

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

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());
        }
    }

}
void循环(xml_节点*species)
{
节点t1=*新节点();
xml_节点*名称_节点=物种->第一个_节点(“名称”);
if(name_node!=0)
{
t1.setName(name_node->value());
cout value()第一个节点(“种类”);
如果(子项!=0)
{
cout first_node(“name”)->value()first_node()->next_sibling()!=0)
{
循环(子节点->第一个节点()->下一个兄弟节点());
xml_node*child2=child->next_sibling();
cout first_node()->value()first_node()->next_sibling());
}
}
}
它只经过每个节点返回海洋生物的第一个子节点 鱼 旗鱼 陆生动物 哺乳动物 狗


如果有任何指向正确方向的指针,我将不胜感激。谢谢!

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

您的递归方法对于访问子对象是一个可行的选择。它似乎起作用了。对
循环
的每个递归调用都深入到子对象的一个层次。(谁告诉您使用“队列”可能意味着“堆栈”…递归隐式使用堆栈。调用堆栈。)

由于递归被用来深入XML树,这可能不会用更多的递归来解决

请查看您代码的以下代码部分:

xml_node<> * child = species->first_node("species");
if(child != 0)
{
    cout << child->first_node("name")->value() << endl;
xml_节点*child=species->first_节点(“species”);
如果(子项!=0)
{

cout first_node(“name”)->value()我知道这个问题已经得到了回答,但我只想给出一个有用的提示

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


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

陆地动物不是一个物种。用法:)是的,我实际上在为一个巨大的系统发育树做这个项目,我只是把它简化为一个小的基本树,只是为了得到解析的想法:)谢谢你的帮助p、 我将if语句更改为(xml\u node*child=species->first\u node(“species”);child!=0;child=child->next\u sibling())
我得到了输出
海洋生物鱼箭鱼石斑鱼陆地动物哺乳动物狗猫陆地动物哺乳动物狗猫。循环现在通过鱼节点的子节点和哺乳动物节点两次。你知道我应该如何解决这个问题吗?