Извлечь все узлы узла в файле XML с помощью Pugixml C++

У меня есть файл XML со следующей структурой:

<Employee>
    <Address>
        <Name>XYZ</CustomerName>
        <Street>street no. 1</Street>
        <City>current city</City>
        <Country>country</Country>
    </Address>
</Employee>

Я хочу извлечь значения всех узлов узла Address и сохранить значения в векторе строк (т.е. std::vector<std::string> EmployeeAdressDetails).

Как извлечь узлы в цикле, а не извлекать значения по одному?

ОБНОВЛЕНИЕ: под "извлечением по одному" я имею в виду что-то вроде следующего:

xml_node root_node = doc.child("Employee");
xml_node Address_node = root_node.child("Address");
xml_node Name_node = Address_node .child("Name");
xml_node Street_node = Address_node .child("Street");
xml_node City_node = Address_node .child("City");
xml_node Country_node = Address_node .child("Country");

person skm    schedule 12.12.2016    source источник
comment
Разве извлечение узлов в цикле не извлекает их один за другим? Можете ли вы объяснить разницу между ними? Я не совсем уверен, что вы имеете в виду.   -  person Borgleader    schedule 12.12.2016
comment
@Borgleader: я обновил свой вопрос, чтобы уточнить, что я имею в виду под извлечением по одному. Пожалуйста, посмотрите.   -  person skm    schedule 12.12.2016


Ответы (1)


Ты можешь это сделать:

for(auto node: doc.child("Employee").child("Address").children())
{
    std::cout << node.name() << ": " << node.text().as_string() << '\n';
}

Или для компиляторов до C++11:

pugi::xml_object_range<pugi::xml_node_iterator> nodes = doc.child("Employee").child("Address").children();

for(pugi::xml_node_iterator node = nodes.begin(); node != nodes.end(); ++node)
{
    std::cout << node->name() << ": " << node->text().as_string() << '\n';
}

Вывод:

Name: XYZ
Street: street no. 1
City: current city
Country: country
person Galik    schedule 12.12.2016
comment
for(auto node: doc.child("Employee").child("Address").children()) имеет синтаксическую проблему в соответствии с моей IDE. - person skm; 12.12.2016
comment
Используете ли вы компилятор, поддерживающий C++11? - person Borgleader; 12.12.2016
comment
нет... я заменил auto на xml_node, но не знаю остального синтаксиса - person skm; 12.12.2016
comment
Тогда вам нужно использовать обычный цикл for. Я не удивлюсь, если .childen() вернет вектор или какой-либо другой контейнер, так что просто возьмите ссылку на него и выполните обычный цикл for, как обычно. Или, в качестве альтернативы, рассмотрите возможность обновления вашего компилятора (если возможно). - person Borgleader; 12.12.2016
comment
@skm Я добавил альтернативный синтаксис для старых компиляторов. - person Galik; 12.12.2016