libxml 关关键字解析xml文件的例子

来源:互联网 发布:费洛伊德算法 编辑:程序博客网 时间:2024/05/01 12:32

demo.xml文件内容如下:

<?xml version="1.0"?>
<story>
  <storyinfo>
    <author>John Fleck</author>
    <datewritten>June 2, 2002</datewritten>
    <keyword>example keyword</keyword>
  </storyinfo>
  <body>
    <headline>This is the headline</headline>
    <para>This is the body text.</para>
  </body>
</story>

demo.c代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void parseStory(xmlDocPtr doc,xmlNodePtr cur){
 xmlChar *key;
 cur=cur->xmlChildrenNode;
 while(cur!=NULL){
  if( (!xmlStrcmp(cur->name,(const xmlChar*)"keyword")) ){
     key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
     printf("keyword: %s/n", key);
     xmlFree(key);
  }
  cur = cur->next;
 }
 return;
}

static void parseDoc(char *docname){
 xmlDocPtr doc;
 xmlNodePtr cur;
 doc=xmlParseFile(docname);
 if(doc==NULL){
  fprintf(stderr,"Document not parsed successfully. /n");
  return;
 }
 cur = xmlDocGetRootElement(doc);
 if(cur==NULL){
  fprintf(stderr,"empty document/n");
  xmlFreeDoc(doc);
  return;
 }
 if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
  fprintf(stderr,"document of the wrong type, root node != story");
  xmlFreeDoc(doc);
  return;
 }
 cur = cur->xmlChildrenNode;
 while (cur != NULL) {
  if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
   parseStory (doc, cur);
  }
  cur = cur->next;
 }

 xmlFreeDoc(doc);
 return;
}

 

int main(int argc,char **argv){
 char *docname;
 if(argc<=1){
  printf("Usage: %s docname/n", argv[0]);
  return(0);
 }
 docname=argv[1];
 parseDoc(docname);
 return (1);
}

 

解译命令:

gcc -o demo  demo.c -I/home/oracle/libxmldemo -lxml2

执行命令:

./demo demo.xml