Извлечение содержимого из 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;
}

Что кажется правильным в моих тестовых случаях.

Другие вопросы по тегам