libxmlでxpath

さっきのxpathの動作確認で書いたサンプルを書いておきます。

#include "stdio.h"
#include "libxml/HTMLparser.h"
#include "libxml/xpath.h"

int main() {
  int result = 0;

  htmlDocPtr doc;  
  xmlXPathContextPtr ctx;
  xmlXPathObjectPtr nodes;

  char* url = "http://location/of/html";
  char* enc = "utf-8";
  xmlChar* xpath = (xmlChar*)"//table[2]";
  
  if (doc = htmlReadFile(url, enc, HTML_PARSE_RECOVER)) {
    if (ctx = xmlXPathNewContext(doc)) {
      nodes = xmlXPathEval(xpath, ctx);
      if (!xmlXPathNodeSetIsEmpty(nodes->nodesetval)) {
        xmlNodeSetPtr nodesetvals = nodes->nodesetval;
        for (int i = 0; i < nodesetvals->nodeNr; i++) {
          xmlNodePtr cur = nodesetvals->nodeTab[i];
          printf("%s : %s : %s\n",
                 (char*)cur->name,
                 (char*)cur->properties[0].name,
                 (char*)cur->properties[0].children->content
          );
        }
        xmlXPathFreeObject(nodes);      
      }
      xmlXPathFreeContext(ctx);
    }
    xmlFreeDoc(doc);
  }

  xmlCleanupParser();
  xmlCleanupCharEncodingHandlers();
  xmlDictCleanup();
  
  return result;
}

久々にcで書くと大変すぎて唖然としますね。c++とかjavaで仕事してた時はコンパイルが面倒とか思った事は無かったですが、漸くその意味が分かりました。後はやっぱりException使わないと読めないですね。でもどんな例外が発生するかとか面倒でサンプル書く時にはやってられないです。

Leave a Reply

Your email address will not be published. Required fields are marked *