PugiXML从递归xml_tree_walker

时间:2017-11-16 12:58:56

标签: c++ xml recursion pugixml

我正在尝试使用pugiXML遍历函数从XML中提取数据,如下图所示。我能够使用此函数打印出XML文件中的所有数据,但是我无法将这些数据提取并存储到我的变量中。主要问题是我无法同时获取node.name()和node.value()。 node.name()进入1次迭代,node.value()进入迭代之后。

    const char* node_types[] =
{
    "null","Element", "Name", "InstancePath", "InstancePathDepth", "FieldAmount", "DataType", "TypeName", "DataSize", "ArrayTypeName", "LowerBound", "UpperBound", "BitPosition", "IsArray", "IsElementary", "IsProgram", "IsResource", "IsString", "IsStruct", "IsTask"
};

    // tag::impl[]
    struct simple_walker : pugi::xml_tree_walker
    {
        virtual bool for_each(pugi::xml_node& node)
        {

            for (int i = 0; i < depth(); ++i) std::cout << "  "; // indentation             


                std::cout << node.name()<<" "<< node.value() << "\n";


            return true; // continue traversal
        }
    };

enter image description here enter image description here

输出很棒,与XML文件相同。

1 个答案:

答案 0 :(得分:1)

您可以跳过不属于node_element类型的元素,并大致使用node.child_value()

    virtual bool for_each(pugi::xml_node& node)
    {
        if (node.type() != pugi::node_element)
            return true;

        for (int i = 0; i < depth(); ++i) std::cout << "  "; // indentation             

        std::cout << node.name()<<" "<< node.child_value() << "\n";

        return true; // continue traversal
    }

这是必要的,因为文本(PCDATA)节点与元素节点是分开的:https://pugixml.org/docs/manual.html#node_pcdata