1

libxmlを使用してxmlを解析し始めました。ルートノード「ビートルズ」が存在するかどうかを知り、サブチャイルド「lastname」を取得する必要があります。私のコードは以下の通りです

#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関数がある場合は、教えてください。ありがとう。

4

1 に答える 1

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;
}
于 2012-07-08T10:33:08.640 に答える