pugixml - 获取所有文本节点(PCDATA),而不仅仅是第一个

时间:2014-02-15 07:35:48

标签: c++ xml pugixml

目前,如果我尝试解析

<parent>
    First bit of text
    <child>
    </child>
    Second bit of text
</parent>

我只使用

获得First bit of text
parent.text().get()

parent中抓取所有文本节点的正确方法是什么?

  1. 这个有很好的实用功能吗?
  2. 怎么能迭代所有孩子?

2 个答案:

答案 0 :(得分:4)

没有连接所有文本的功能;如果要获取文本节点子项列表,可以使用以下两个选项:

  1. XPath查询:

    pugi::xpath_node_set ns = parent.select_nodes("text()");
    
    for (size_t i = 0; i < ns.size(); ++i)
        std::cout << ns[i].node().value() << std::endl;
    
  2. 手动迭代w /类型检查:

    for (pugi::xml_node child = parent.first_child(); child; child = child.next_sibling())
        if (child.type() == pugi::node_pcdata)
            std::cout << child.value() << std::endl;
    
  3. 请注意,如果您可以使用C ++ 11,那么第二个选项可以更加简洁:

    for (pugi::xml_node child: parent.children())
        if (child.type() == pugi::node_pcdata)
            std::cout << child.value() << std::endl;
    

    (当然,你也可以使用ranged来迭代xpath_node_set)

答案 1 :(得分:0)

在我的pugixml版本中,我可以使用print方法将所有内部xml从节点转换为流。例如。: std::stringstream ss; node.print(ss); return ss.str();