1bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT<![CDATA[
2bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT#include <libxml/parser.h>
3bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT#include <libxml/xpath.h>
4bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
5bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDTxmlDocPtr
6bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDTgetdoc (char *docname) {
7bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlDocPtr doc;
8bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	doc = xmlParseFile(docname);
9bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
10bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	if (doc == NULL ) {
11bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		fprintf(stderr,"Document not parsed successfully. \n");
12bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		return NULL;
13bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	}
14bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
15bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	return doc;
16bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT}
17bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
18bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDTxmlXPathObjectPtr
19bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDTgetnodeset (xmlDocPtr doc, xmlChar *xpath){
20bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
21bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlXPathContextPtr context;
22bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlXPathObjectPtr result;
23bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
24bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	context = xmlXPathNewContext(doc);
254c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT	if (context == NULL) {
264c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT		printf("Error in xmlXPathNewContext\n");
274c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT		return NULL;
284c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT	}
29bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	result = xmlXPathEvalExpression(xpath, context);
304c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT	xmlXPathFreeContext(context);
314c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT	if (result == NULL) {
324c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT		printf("Error in xmlXPathEvalExpression\n");
334c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT		return NULL;
344c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT	}
35bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
364c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT		xmlXPathFreeObject(result);
37bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT                printf("No result\n");
38bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		return NULL;
39bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	}
40bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	return result;
41bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT}
42bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDTint
43bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDTmain(int argc, char **argv) {
44bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
45bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	char *docname;
46bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlDocPtr doc;
47218ed39dc40c31c1e27d1d9a8c4c8765aa1b3dc3MDT	xmlChar *xpath = (xmlChar*) "//keyword";
48bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlNodeSetPtr nodeset;
49bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlXPathObjectPtr result;
50bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	int i;
51bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlChar *keyword;
52bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
53bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	if (argc <= 1) {
54bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		printf("Usage: %s docname\n", argv[0]);
55bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		return(0);
56bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	}
57bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT
58bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	docname = argv[1];
59bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	doc = getdoc(docname);
60bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	result = getnodeset (doc, xpath);
61bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	if (result) {
62bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		nodeset = result->nodesetval;
63bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		for (i=0; i < nodeset->nodeNr; i++) {
64bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT			keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
65bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		printf("keyword: %s\n", keyword);
66d14bccc241b9e1cdf7718d7c86e4acfb768f2261MST		xmlFree(keyword);
67bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT		}
68d14bccc241b9e1cdf7718d7c86e4acfb768f2261MST		xmlXPathFreeObject (result);
69bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	}
70bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlFreeDoc(doc);
71bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	xmlCleanupParser();
72bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT	return (1);
73bc6734a5c50a520a6e7dfce7f1fafd08ad6ea707MDT}
744c3bb7d8a20c5262882af7fcd41afe3b3d482f12MDT]]>