2014-10-14 3 views
2

У меня есть этот вопрос о форсированном XML разборе:C++ простой синтаксический анализ с повышающим XML со свойством дерева

здесь является частью моей Xml:

<Clients> 
    <Client name="Alfred" /> 
    <Client name="Thomas" /> 
    <Client name="Mark" /> 
</Clients> 

и я прочитал имя с этим кодом:

std::string name = pt.get<std::string>("Clients.Client.<xmlattr>.name, "No name"); 

и работает нормально, но получить всегда первый узел ..

есть ли способ, чтобы получить S второй, третий узел без цикла?

спасибо

ответ

4

Нет объекта для запроса многозначных ключей в дереве свойств. (Отчасти потому, что большинство поддерживаемых бэкэнд-форматов официально не поддерживают дубликаты ключей).

Однако, вы можете перебирать дочерние элементы, так что вы можете реализовать свой собственный запрос, например, так:

for (auto& child : pt.get_child("Clients")) 
    if (child.first == "Client") 
     std::cout << child.second.get<std::string>("<xmlattr>.name", "No name") << "\n"; 

Смотреть полностью рабочий образец Live On Coliru:

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
#include <sstream> 
#include <iostream> 

using boost::property_tree::ptree; 

int main() 
{ 
    std::stringstream ss("<Clients>\n" 
     " <Client name=\"Alfred\" />\n" 
     " <Client name=\"Thomas\" />\n" 
     " <Client name=\"Mark\" />\n" 
     "</Clients>"); 

    ptree pt; 
    boost::property_tree::read_xml(ss, pt); 

    for (auto& child : pt.get_child("Clients")) 
    { 
     if (child.first == "Client") 
      std::cout << child.second.get<std::string>("<xmlattr>.name", "No name") << "\n"; 
    } 
}; 
+0

благодаря @sehe ! Я попробую! – ghiboz

+0

Могу я исправить вашу гиперссылку? Im не смог получить доступ и хотел бы видеть контент. Заранее спасибо! – IdusOrtus

+0

@IdusOrtus Ссылка работает для меня. Можете ли вы попробовать еще раз? – sehe

Смежные вопросы