1<![CDATA[
2#include <stdio.h>
3#include <string.h>
4#include <stdlib.h>
5#include <libxml/xmlmemory.h>
6#include <libxml/parser.h>
7
8void
9parseStory (xmlDocPtr doc, xmlNodePtr cur) {
10
11	xmlChar *key;
12	cur = cur->xmlChildrenNode;
13	while (cur != NULL) {
14	    if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
15		    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
16		    printf("keyword: %s\n", key);
17		    xmlFree(key);
18 	    }
19	cur = cur->next;
20	}
21    return;
22}
23
24static void
25parseDoc(char *docname) {
26
27	xmlDocPtr doc;
28	xmlNodePtr cur;
29
30	doc = xmlParseFile(docname);
31
32	if (doc == NULL ) {
33		fprintf(stderr,"Document not parsed successfully. \n");
34		return;
35	}
36
37	cur = xmlDocGetRootElement(doc);
38
39	if (cur == NULL) {
40		fprintf(stderr,"empty document\n");
41		xmlFreeDoc(doc);
42		return;
43	}
44
45	if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
46		fprintf(stderr,"document of the wrong type, root node != story");
47		xmlFreeDoc(doc);
48		return;
49	}
50
51	cur = cur->xmlChildrenNode;
52	while (cur != NULL) {
53		if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
54			parseStory (doc, cur);
55		}
56
57	cur = cur->next;
58	}
59
60	xmlFreeDoc(doc);
61	return;
62}
63
64int
65main(int argc, char **argv) {
66
67	char *docname;
68
69	if (argc <= 1) {
70		printf("Usage: %s docname\n", argv[0]);
71		return(0);
72	}
73
74	docname = argv[1];
75	parseDoc (docname);
76
77	return (1);
78}
79]]>
80