2 * gjobread.c : a small test program for gnome jobs XML format
4 * See Copyright for the status of this software.
6 * Daniel.Veillard@w3.org
14 * This example should compile and run indifferently with libxml-1.8.8 +
16 * Check the COMPAT comments below
20 * COMPAT using xml-config --cflags to get the include path this will
23 #include <libxml/xmlmemory.h>
24 #include <libxml/parser.h>
26 #define DEBUG(x) printf(x)
30 * an xmlChar * is really an UTF8 encoded char string (0 terminated)
32 typedef struct person {
36 xmlChar *organisation;
43 * And the code needed to parse it
46 parsePerson(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
49 DEBUG("parsePerson\n");
53 ret = (personPtr) malloc(sizeof(person));
55 fprintf(stderr,"out of memory\n");
58 memset(ret, 0, sizeof(person));
60 /* We don't care what the top level element name is */
61 /* COMPAT xmlChildrenNode is a macro unifying libxml1 and libxml2 names */
62 cur = cur->xmlChildrenNode;
64 if ((!xmlStrcmp(cur->name, (const xmlChar *)"Person")) &&
66 ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
67 if ((!xmlStrcmp(cur->name, (const xmlChar *)"Email")) &&
69 ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
80 printPerson(personPtr cur) {
81 if (cur == NULL) return;
82 printf("------ Person\n");
83 if (cur->name) printf(" name: %s\n", cur->name);
84 if (cur->email) printf(" email: %s\n", cur->email);
85 if (cur->company) printf(" company: %s\n", cur->company);
86 if (cur->organisation) printf(" organisation: %s\n", cur->organisation);
87 if (cur->smail) printf(" smail: %s\n", cur->smail);
88 if (cur->webPage) printf(" Web: %s\n", cur->webPage);
89 if (cur->phone) printf(" phone: %s\n", cur->phone);
94 * a Description for a Job
102 personPtr developers[100]; /* using dynamic alloc is left as an exercise */
106 * And the code needed to parse it
109 parseJob(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur) {
114 * allocate the struct
116 ret = (jobPtr) malloc(sizeof(job));
118 fprintf(stderr,"out of memory\n");
121 memset(ret, 0, sizeof(job));
123 /* We don't care what the top level element name is */
124 cur = cur->xmlChildrenNode;
125 while (cur != NULL) {
127 if ((!xmlStrcmp(cur->name, (const xmlChar *) "Project")) &&
129 ret->projectID = xmlGetProp(cur, (const xmlChar *) "ID");
130 if (ret->projectID == NULL) {
131 fprintf(stderr, "Project has no ID\n");
134 if ((!xmlStrcmp(cur->name, (const xmlChar *) "Application")) &&
137 xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
138 if ((!xmlStrcmp(cur->name, (const xmlChar *) "Category")) &&
141 xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
142 if ((!xmlStrcmp(cur->name, (const xmlChar *) "Contact")) &&
144 ret->contact = parsePerson(doc, ns, cur);
155 printJob(jobPtr cur) {
158 if (cur == NULL) return;
159 printf("======= Job\n");
160 if (cur->projectID != NULL) printf("projectID: %s\n", cur->projectID);
161 if (cur->application != NULL) printf("application: %s\n", cur->application);
162 if (cur->category != NULL) printf("category: %s\n", cur->category);
163 if (cur->contact != NULL) printPerson(cur->contact);
164 printf("%d developers\n", cur->nbDevelopers);
166 for (i = 0;i < cur->nbDevelopers;i++) printPerson(cur->developers[i]);
167 printf("======= \n");
171 * A pool of Gnome Jobs
173 typedef struct gjob {
175 jobPtr jobs[500]; /* using dynamic alloc is left as an exercise */
180 parseGjobFile(char *filename) {
188 * build an XML tree from a the file;
190 doc = xmlParseFile(filename);
191 if (doc == NULL) return(NULL);
194 * Check the document is of the right kind
197 cur = xmlDocGetRootElement(doc);
199 fprintf(stderr,"empty document\n");
203 ns = xmlSearchNsByHref(doc, cur,
204 (const xmlChar *) "http://www.gnome.org/some-location");
207 "document of the wrong type, GJob Namespace not found\n");
211 if (xmlStrcmp(cur->name, (const xmlChar *) "Helping")) {
212 fprintf(stderr,"document of the wrong type, root node != Helping");
218 * Allocate the structure to be returned.
220 ret = (gJobPtr) malloc(sizeof(gJob));
222 fprintf(stderr,"out of memory\n");
226 memset(ret, 0, sizeof(gJob));
229 * Now, walk the tree.
231 /* First level we expect just Jobs */
232 cur = cur->xmlChildrenNode;
233 while ( cur && xmlIsBlankNode ( cur ) )
239 if ((xmlStrcmp(cur->name, (const xmlChar *) "Jobs")) || (cur->ns != ns)) {
240 fprintf(stderr,"document of the wrong type, was '%s', Jobs expected",
242 fprintf(stderr,"xmlDocDump follows\n");
243 xmlDocDump ( stderr, doc );
244 fprintf(stderr,"xmlDocDump finished\n");
250 /* Second level is a list of Job, but be laxist */
251 cur = cur->xmlChildrenNode;
252 while (cur != NULL) {
253 if ((!xmlStrcmp(cur->name, (const xmlChar *) "Job")) &&
255 curjob = parseJob(doc, ns, cur);
257 ret->jobs[ret->nbJobs++] = curjob;
258 if (ret->nbJobs >= 500) break;
267 handleGjob(gJobPtr cur) {
271 * Do whatever you want and free the structure.
273 printf("%d Jobs registered\n", cur->nbJobs);
274 for (i = 0; i < cur->nbJobs; i++) printJob(cur->jobs[i]);
277 int main(int argc, char **argv) {
281 /* COMPAT: Do not genrate nodes for formatting spaces */
283 xmlKeepBlanksDefault(0);
285 for (i = 1; i < argc ; i++) {
286 cur = parseGjobFile(argv[i]);
290 fprintf( stderr, "Error parsing file '%s'\n", argv[i]);
294 /* Clean up everything else before quitting. */