2008-07-06 たまには備忘録らしく
[xml][libxml2][c]XMLをHTTPで取得して、XPathで指定された中身をC言語で取り出す方法
タイトル通り。必要に迫られて…
libxml2はAPIの数がオニのようにあります。泣きそうです。
注意:ルートノードが1つの文書しか対応していません。
根性不足で、URLからxmlDocPtrを得られるAPIを見つけられなかったため、
xmlTextReaderPtrで最初のノードを読み、
xmlTextReaderExpandで強引に子ノードを取ってこさせています。
大変ダサいので、libxml2ウィザードの方の降臨を願う。
gcc -o test -I/usr/include/libxml2 test.c -lxml2
#include <stdio.h> #include <libxml/xpath.h> #include <libxml/xmlreader.h> #define URL "http://www.nicovideo.jp/api/getthumbinfo/sm9" #define XPATH "/nicovideo_thumb_response[@status='ok']/thumb/title/text()" int main(int argc, char *argv[]) { int ret; xmlDocPtr doc; xmlNodeSetPtr nodes; xmlXPathContextPtr ctx; xmlTextReaderPtr reader; xmlXPathObjectPtr xpobj; if ((reader = xmlNewTextReaderFilename(URL))) { // FIXME: now only one root node is supported ret = xmlTextReaderRead(reader); xmlTextReaderExpand(reader); if ((doc = xmlTextReaderCurrentDoc(reader))) { if ((ctx = xmlXPathNewContext(doc))) { if ((xpobj = xmlXPathEvalExpression( (xmlChar *)XPATH, ctx))) { if (!xmlXPathNodeSetIsEmpty(xpobj->nodesetval)) { xmlNodePtr node = xmlXPathNodeSetItem(xpobj->nodesetval, 0); if (node->content) { printf("%s\n", node->content); } } xmlXPathFreeObject(xpobj); } xmlXPathFreeContext(ctx); } xmlFreeDoc(doc); } xmlFreeTextReader(reader); } xmlCleanupParser(); return 0; }
トラックバック - http://d.hatena.ne.jp/tasukuchan/20080706/1215344211
リンク元
- 473 http://d.hatena.ne.jp/hakutoitoi/20090319/1237397160
- 434 http://okyuu.com/ja/tips/1951
- 216 http://labs.gmo.jp/blog/ku/2008/07/libxmlhtmlxpathid.html
- 129 http://d.hatena.ne.jp/cube_tamayura/20110615
- 39 http://okyuu.com/ja/tips/1951?cid=tips_similar_t_d
- 29 http://faves.com/users/ku0522/dot/122285693910
- 27 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GFRC_ja___JP218&q=libxml+xmlDocPtr
- 26 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=G7h&q=グニャラくん&btnG=検索&lr=lang_ja
- 20 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=71w&q=libxml2&start=10&sa=N
- 19 http://clip.livedoor.com/page/2437913/ [xml][libxml2][c]XMLをHTTPで取得して、XPathで指定された中身をC言語で%


