所以我有我需要搜索特定标签的 xml 文档。我正在使用 libxml2,并且我有一个函数可以递归地搜索具有指定名称的节点并输出它们的数量。但是当我传递同一个函数时,一个数组来填充一些奇怪的事情基本上发生了,我认为我应该传递一个三重指针,但一切似乎都没有正常工作,我传递函数的内存地址发生了一些事情。我是一个初学者,虽然我对指针有很好的处理,但我认为 typedef 和多个指针层把我搞砸了。在发布此之前,我确实看过很多帖子。代码在我的机器上编译,但是当我打印收集的节点的名称时出现段错误。
#include <stdio.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
int FindNodesByTagName(xmlNodePtr *ptr_array[], xmlNodePtr a_node, char tagname[]);
int main(void)
{
int num_chan, k;
xmlDocPtr doc;
xmlNodePtr cur;
xmlNodePtr *x;
char xstr[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<chan>"
"<blah>"
"<wrong>"
"<other>"
"<ele>some_text</ele>"
"<foo>"
"<enabled>true</enabled>"
"</foo>"
"<foo>"
"<enabled>true</enabled>"
"</foo>"
"</other>"
"</wrong>"
"</blah>"
"<blah>"
"<foo>"
"<enabled>true</enabled>"
"</foo>"
"<foo>"
"<enabled>false</enabled>"
"</foo>"
"</blah>"
"<enabled>false</enabled>"
"<enabled>true</enabled>"
"</chan>";
doc = xmlParseMemory(xstr, sizeof(xstr) / sizeof(*xstr) );
cur = xmlDocGetRootElement(doc);
num_chan = FindNodesByTagName(NULL, cur, "enabled");
x = calloc(sizeof(xmlNodePtr), num_chan);
FindNodesByTagName(&x, cur, "enabled");
for(k=0; k < num_chan; k++)
printf("%s\n", x[k]->name);
printf("%i\n", num_chan);
free(x);
return 0;
}
int FindNodesByTagName(xmlNodePtr *ptr_array[], xmlNodePtr a_node, char tagname[]){
int counter = 0;
xmlNode *cur_node = NULL;
int isElementNode;
int isTagName;
for (cur_node = a_node; cur_node; cur_node = cur_node->next){
isElementNode = (cur_node->type == XML_ELEMENT_NODE);
isTagName = !xmlStrcmp(cur_node->name, (const xmlChar *) tagname);
if (isElementNode & isTagName){
counter ++;
if (ptr_array != NULL) {
**ptr_array = cur_node;
/*printf("P2P %p, CA %p, DR %p, V %p\n", ptr_array, *ptr_array, **ptr_array, cur_node);*/
(*ptr_array)++;
}
}
counter += FindNodesByTagName(ptr_array, cur_node->children, tagname);
}
return counter;
}