XML解析器使用的libxml [英] XML Parser using libxml

查看:96
本文介绍了XML解析器使用的libxml的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚开始使用的libxml解析XML。我只需要知道根节点甲壳虫是present与否,然后获取subchild姓氏。我的code是低于

I just started using libxml to parse the xml. I just need to know root node "beatles" is present or not, then get the subchild "lastname". My code is below

#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>

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

I am able to get root node "beatles", but i am unable to find the "name" and "lastname". Please help me with this.

如果有任何其他的libxml功能使用,请告诉我。
谢谢你。

If there are any other libxml functions to use, please tell me. Thanks.

推荐答案

您需要在您的while循环的微小变化。

You need a small change in your while loop.

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;
}

这篇关于XML解析器使用的libxml的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆