lib xml вставил новый узел во время чтения - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь проанализировать файл xml из моей программы. Я могу получить корневой узел и напечатать его имя, свойство et c. успешно (без тяжелой работы, только вызов API). Но когда я пытаюсь прочитать его дочерний узел и напечатать его имя, я не получаю то, что есть в xml.

Вот мой xml файл

<?xml version ="1.0" encoding ="UTF-8" ?>
<LanguageStats>
    <Languages>
        <Language name="C">
            <extensions key="c"/>
            <color key="\x1b[33m"/>
        </Language> 
    </Languages>
</LanguageStats>

Вот мой C код

#include <stdio.h>
#include <unistd.h>
#include <libxml/parser.h>
#include <libxml/tree.h>


#define XML_CFG_FILE "./lang_list.xml"

static void parse_xml(xmlNode* root_node)
{
    xmlNode *curr_node = NULL;

    if( root_node != NULL )
    {
        printf("\nRoot Element %s", root_node->name);
        curr_node = root_node->children;
        printf("\nCurrent Element %s", curr_node->name);
        curr_node = curr_node->children;
        if( !curr_node )
        {
            printf(" Something is wrong");
        }
    }
    else
    {
        printf("Root Element NULL");
    }
}

int main()
{
    xmlDoc *doc = NULL;
    xmlNode *root_element = NULL;

    LIBXML_TEST_VERSION 

    if( ( doc = xmlReadFile( XML_CFG_FILE, NULL, 0)) == NULL )
    {
        printf("error: could not parse file %s\n", XML_CFG_FILE);
        exit(-1);
    }

    root_element = xmlDocGetRootElement(doc);
    parse_xml(root_element);
    return 0;
}

Я получаю этот вывод ниже.

Root Element LanguageStats
Current Element text Something is wrong

Когда я изменяю лог c на

printf("\nRoot Element %s", root_node->name);
curr_node = root_node->children;
printf("\nCurrent Element %s", curr_node->name);
curr_node = curr_node->next;
printf("\nCurrent Element %s", curr_node->name);

, мой вывод становится

Root Element LanguageStats
Current Element text
Current Element Languages

Мой вопрос: я что-то упустил? или lib xml всегда так работает? Это беспокоит меня, и я не могу решить это. Любые небольшие советы будут оценены

1 Ответ

0 голосов
/ 05 марта 2020

Я понял, как получить следующий Элемент. Здесь я прилагаю фрагмент кода

static xmlNode* GetNextNode(const xmlNode* node )
{   
    xmlNode* ret_node = node->next;

    while( ret_node )
    {
        /* Node has type XML_ELEMENT_NODE, if it has property to hold children */
        if( ret_node->type != XML_ELEMENT_NODE ) 
        {
            ret_node = ret_node->next;
        }
        else
        {
            printf("Found element node %s\n", ret_node->name );
            break;
        }
    }   
    return ret_node;
}

Это как-то работает для меня.

...