メイン関数から直接libxmlの関数を呼ぶ最小限のサンプル
「&」とかの実体参照化しなければいけない文字がある場合エラーは出るが、とりあえず最後まで動くはず。
#include <libxml/HTMLparser.h> #include <iostream> using namespace std; void FindInfo(xmlNode*& element); int main() { // HTML用の構造体 htmlDocPtr m_doc; // ファイル名とエンコードの設定 char* file = "./sample.html"; char* enc = "utf-8"; // xmlの読み込み if (m_doc = htmlReadFile(file, enc, HTML_PARSE_RECOVER)) { htmlNodePtr root = xmlDocGetRootElement(m_doc); if (root != NULL) { FindInfo(root); } xmlFreeDoc(m_doc); m_doc = NULL; } xmlCleanupParser(); xmlCleanupCharEncodingHandlers(); } void FindInfo(xmlNode*& element) { for (htmlNodePtr node = element; node != NULL; node = node->next) { if (node->type == XML_ELEMENT_NODE) { /** もしノードの中身が「A」タグでattributeに「HREF」が含まれていれば表示 */ if(xmlStrcasecmp(node->name, (const xmlChar*)"A") == 0){ for(xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next){ if(xmlStrcasecmp(attr->name, (const xmlChar*)"HREF") == 0){ printf((char *)node->children->content, "%s\n"); } } } // 再帰読み込み if(node->children != NULL) { FindInfo(node->children); } } } }