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

6

目前,如果我尝试解析

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

我只能获取第一段文本

parent.text().get()

如何正确地获取parent中的所有文本节点?

  1. 是否有一个好用的实用函数可以做到这一点?
  2. 如何通过迭代所有子节点来完成此操作?
2个回答

9

没有将所有文本连接起来的函数;如果你想获取文本节点子元素列表,有两个选项:

  1. XPath query:

     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. Manual iteration w/type checking:

     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;
    
请注意,如果您可以使用C++11,则第二个选项可能会更加简洁:
for (pugi::xml_node child: parent.children())
    if (child.type() == pugi::node_pcdata)
        std::cout << child.value() << std::endl;

(当然,您也可以使用范围for来遍历xpath_node_set)

非常好的答案,谢谢!我特别喜欢第二种方法,因为它可以与其他节点一起排序,如果这对应用程序很重要的话。 - jozxyqk

0
在我使用的pugixml版本中,我可以使用print方法将节点内所有的xml内容输出到流中。例如: std::stringstream ss; node.print(ss); return ss.str();

可能需要详细说明一下。"我拥有的版本"对其他读者来说是无用的。请明确提供版本号。 - StoryTeller - Unslander Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接