libxml 在读取时插入了新节点
libxml inserted new node while reading
我正在尝试从我的程序中解析一个 xml 文件。我能够获取根节点并成功打印其名称,属性 等(无需努力,只需调用 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
当我将逻辑更改为
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
我的问题是我遗漏了什么吗?还是 libxml 总是那样工作?这让我很烦恼,我无法解决这个问题。任何小提示将不胜感激
我想出了如何获得下一个元素。在这里,我附上代码片段
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;
}
这对我有用。
我想出了如何获得下一个元素。在这里,我附上代码片段
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;
}
这对我有用。
我正在尝试从我的程序中解析一个 xml 文件。我能够获取根节点并成功打印其名称,属性 等(无需努力,只需调用 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
当我将逻辑更改为
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
我的问题是我遗漏了什么吗?还是 libxml 总是那样工作?这让我很烦恼,我无法解决这个问题。任何小提示将不胜感激
我想出了如何获得下一个元素。在这里,我附上代码片段
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;
}
这对我有用。
我想出了如何获得下一个元素。在这里,我附上代码片段
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;
}
这对我有用。