[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]
libxmlのC++ラッパーであるlibxml++を使おうとしたものの、上手くいきませんでした。
アクセスしようとしているglibmmconfig.hは最新版glibmm 2.68にはありません。2.4にはあるとのことだったのでダウンロードして存在を確認しました。ただしこれは2014年リリースのものです。
本家のlibxmlで事足りているため、libxml++に対する需要はあまり高くないのでしょうか。開発自体は今も続いていますが、深追いはやめておきます。
#include <iostream>
#include <string>
#include <vector>
#include <curl/curl.h>
#include <libxml++/libxml++.h>
#include <iostream>
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* buffer)
{
size_t totalSize = size * nmemb;
buffer->append((char*)contents, totalSize);
return totalSize;
}
int main()
{
// URLからHTMLファイルを取り込む
std::string url = "HTMLのURL";
std::string htmlBuffer;
CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &htmlBuffer);
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (res != CURLE_OK) {
std::cerr << "Error: Failed to download HTML" << std::endl;
return 1;
}
} else {
std::cerr << "Error: Failed to initialize CURL" << std::endl;
return 1;
}
try {
// HTMLをXMLとして解析
xmlpp::DomParser parser;
parser.parse_memory(htmlBuffer);
// ルート要素の取得
xmlpp::Document* document = parser.get_document();
xmlpp::Element* rootElement = document->get_root_node();
// XPathの評価
std::string xpathExpression = "/root/small/a";
xmlpp::NodeSet result = rootElement->find(xpathExpression);
// 結果の表示
for (auto node : result) {
if (xmlpp::Element* element = dynamic_cast<xmlpp::Element*>(node)) {
std::cout << "Element: " << element->get_name() << std::endl;
std::cout << "Value: " << element->get_child_text()->get_content() << std::endl;
}
}
}
catch (const std::exception& ex) {
std::cerr << "Exception caught: " << ex.what() << std::endl;
return 1;
}
return 0;
}
/opt/homebrew/Cellar/glibmm/2.76.0/include/glibmm-2.68/glibmm/ustring.h:20:10: fatal error: 'glibmmconfig.h' file not found
#include <glibmmconfig.h>
^~~~~~~~~~~~~~~~
1 error generated.