2014-02-15 3 views
2

В настоящее время, если я пытаюсь разобратьpugixml - получить все текстовые узлы (PCDATA), а не только первый

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

я только получаю First bit of text с

parent.text().get() 

Что такое правильный способ, чтобы захватить все текстовые узлы в parent?

  1. Есть ли хорошая функция полезности для этого?
  2. Как это можно сделать, повторяя все дети?

ответ

2

Не существует функции, которая объединяет весь текст; если вы хотите, чтобы получить список текстовых узлов детей, у вас есть два варианта:

  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. Руководство итерации ж проверки/типа:

    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; 

(конечно, вы можете также использовать варьировались для перебирать xpath_node_set)

+0

Великий ответ, спасибо! Мне особенно нравится второй метод, поскольку он дает упорядочение с другими узлами, если это важно для приложения. – jozxyqk

0

В версии pugixml у меня есть, я могу использовать метод печати, чтобы получить всю внутреннюю XML от узла в поток. Например .: std::stringstream ss; node.print(ss); return ss.str();

+0

Можете подумать над этим. «Версия, которую я имею», бесполезна для других читателей. Укажите номер явно. – StoryTeller