1

对于我的一个类的项目,我需要使用 xml 文件中的 RapidXML 解析数据并从该数据创建一棵树。几天来我一直在思考如何做到这一点,并且一直在兜圈子。如果有人能帮助我从概念上理解这一点,我将不胜感激。

每个 xml 节点都有一个 name 属性和子节点,我希望能够访问任何给定节点的沿袭,所以我认为 treeNode 类将有一个 name 变量和一个指向其子节点的指针向量。到目前为止这听起来正确吗?

一旦我将节点添加到队列中,以及如何使用这些节点构建树,我对如何创建节点感到非常困惑。我不确定如何区分哪个节点是哪个节点的子节点。这是我解析xml文件的方法。它正确解析和输出,我只是不知道如何将这些节点存储在树数据结构中。

void oneQueue(xml_node<> *xml)
{
    //Initialize queue
    queue<xml_node<>* > q;

    int nodesInCurrentLevel =1;
    int nodesInNextLevel =0;
    //push the first xml node onto the queue
    q.push(xml);

    while(!q.empty())
    {
        //grab the xml node at the front of the queue
        xml_node<> *currNode = q.front();
        xml_node<> *name = currNode->first_node("name");

        //make a node from the xml node
        Node *node = new Node();
        //IF the name has a value, set the name
        if(name != 0) node->setName(name->value());
        q.pop();
        nodesInCurrentLevel--;

        if(node)
        {
            cout << node->getName() << endl;
            //loop through the children of the node and add to the queue
            for(xml_node<> * species = currNode->first_node("species"); species; species = species->next_sibling())
            {
                q.push(species);
                nodesInNextLevel++;
            }
        }
        if (nodesInCurrentLevel == 0) {
            nodesInCurrentLevel = nodesInNextLevel;
            nodesInNextLevel = 0;
        }
    }
}   

树木对我来说是一个新概念,任何指导将不胜感激。谢谢!

4

0 回答 0