我尝试做一些看起来非常简单的事情: 我有这条线
<example status="OK" value="200"/>
我想用libxml2解析它并得到&#34; status&#34;的值和&#34;价值&#34;,但我所有的尝试都失败了。
这是我的实际代码:
#include <libxml/tree.h>
#include <libxml/parser.h>
void Display_Node(xmlDocPtr doc, xmlNodePtr node)
{
// printf("test :: %s\n", xmlNodeListGetString(doc, noeud, 1));
// printf("test :: %s\n", xmlNodeListGetString(doc, noeud->children, 1));
printf("%2d :: ", node->type);
if (node->type == XML_ELEMENT_NODE) {
xmlChar *chemin = xmlGetNodePath(node);
if (node->children && node->children->type == XML_TEXT_NODE) {
xmlChar *contenu = xmlNodeGetContent(node);
printf("%s -> %s\n", chemin, contenu);
xmlFree(contenu);
} else {
printf("%s\n", chemin);
}
xmlFree(chemin);
} else {
printf("NOTHING\n");
}
// printf("\n");
}
void MyXml_Dump(xmlDocPtr doc, xmlNodePtr node)
{
for (xmlNode *tmp = node; tmp; tmp = tmp->next) {
Display_Node(doc, tmp);
if (tmp->children) {
MyXml_Dump(doc, tmp->children);
}
}
}
int main(void)
{
char *xml = "<example status=\"OK\" value=\"200\"/>";
xmlDocPtr doc = xmlParseMemory(xml, strlen(xml));
if (!doc) {
printf("Error while parsing.\n");
return (1);
}
xmlNodePtr racine = xmlDocGetRootElement(doc);
if (!racine) {
fprintf(stderr, "No xml content.\n");
xmlFreeDoc(doc);
return (1);
}
printf("Xml Dump :\n");
MyXml_Dump(doc, racine);
printf("\n");
xmlFreeDoc(doc);
}
我的结果是:
Xml Dump :
1 :: /example
我尝试使用xmlNodeListGetString或xmlNodeGetContent来转储我想要的值,但这不起作用(两者的结果相同)。
似乎这个值根本就不存在(因为我在每个节点都添加了一个printf,看起来只有一个节点),所以我开始怀疑我是否使用了正确的解析函数(xmlParseMemory)或者如果libxml2忽略了这种值。
它不是我经常使用的图书馆,所以我有点迷失。 有办法实现我想要的吗?