2012-07-08 55 views
1

我刚开始使用libxml来解析xml。我只需要知道根节点“beatles”是否存在,然后获取subchild“lastname”。我的代码如下使用libxml的XML解析器

#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; 
     printf ("Here\n"); 
     while (cur != NULL) 
     { 
       if ((!xmlStrcmp (cur -> name, (const xmlChar *) "lastname"))) 
       { 
         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; 
     } 
     printf ("Parsing Successful\n"); 
     cur = xmlDocGetRootElement (doc); 

     if (cur == NULL) 
     { 
       fprintf (stderr, "empty document \n"); 
       xmlFreeDoc (doc); 
       return; 
     } 

     printf ("Got the root Node\n"); 
     if (xmlStrcmp (cur->name, (const xmlChar *) "beatles")) 
     { 
       fprintf (stderr, "Document of the wrong type root node != "); 
       xmlFreeDoc(doc); 
       return; 

     } 
     printf ("Got the root \n"); 
     cur = cur -> xmlChildrenNode; 
     while (cur != NULL) 
     { 
       if (!(xmlStrcmp (cur->name, (const xmlChar *) "name"))) 
       { 
         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); 
} 

和XML文件是

<?xml version="1.0"?> 
<beatles> 
<beatle link="http://www.paulmccartney.com"> 
    <name> 
    <firstname>Paul</firstname> 
    <lastname>McCartney</lastname> 
    </name> 
</beatle> 

我能够得到根节点“甲壳虫”,但我无法找到“名字”和“姓氏”。 请帮我这个。

如果还有其他libxml函数可供使用,请告诉我。 谢谢。

回答

2

您需要在while循环中做一些小改动。

printf ("Got the root \n"); 
cur = cur -> xmlChildrenNode; 
while (cur != NULL) 
{ 
    if (cur->type == XML_ELEMENT_NODE) { 

     if (!(xmlStrcmp (cur->name, (const xmlChar *) "name"))) 
     { 
       parseStory (doc, cur); 
     } 
     cur = cur -> xmlChildrenNode; 
     continue; 
    } 
    cur = cur -> next; 
} 
+0

这对我很有用。 – sach 2012-07-08 13:31:16