Извлечение содержимого из xpath_node_set в общем в pugixml
Прямо сейчас я выполняю этот запрос xpath, используя pugixml:
"//a/@href"
Используя следующий код:
std::vector<std::string> web::parser::query(std::string xpath)
{
pugi::xpath_node_set links = document.select_nodes(xpath.c_str());
std::cout << "OK" << std::endl;
std::vector<std::string> urls;
for (auto link : links)
urls.push_back(link.attribute().value());
return urls;
}
Заметьте, что мне нужно указать, что то, что я запрашиваю, является атрибутом, потому что я вызываю link.attribute().value())
вместо link.node().value())
,
Есть ли способ, которым я могу сделать это query
функция для работы в обоих случаях (атрибут и PCData)?
1 ответ
Решение
Посмотрев справочное руководство от pugixml, я увидел, что xpath_node
это союз xml_node
а также xml_attribute
,
Это означает, что любой из них равен нулю или оба равны. С этой информацией я могу сделать это:
std::vector<std::string> web::parser::query(std::string xpath)
{
pugi::xpath_node_set node_set = document.select_nodes(xpath.c_str());
std::vector<std::string> result;
for (auto xpath_node : node_set) {
if (xpath_node.attribute() != nullptr)
result.push_back(xpath_node.attribute().value());
else
result.push_back(xpath_node.node().child_value());
}
return result;
}
Что кажется правильным в моих тестовых случаях.