gpt4 book ai didi

c - 使用 libxml2 传递指针来搜索 xmlTree

转载 作者:行者123 更新时间:2023-11-30 15:43:39 26 4
gpt4 key购买 nike

所以我有一个 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;
}

最佳答案

使其运行的更改:

int FindNodesByTagName(xmlNodePtr *ptr_array[], xmlNodePtr a_node, char tagname[]);
// becomes
int FindNodesByTagName(xmlNodePtr ptr_array[], xmlNodePtr a_node, char tagname[]);

FindNodesByTagName(&x, cur, "enabled");
// becomes
FindNodesByTagName(x, cur, "enabled");

int FindNodesByTagName(xmlNodePtr *ptr_array[], xmlNodePtr a_node, char tagname[]){
// becomes
int FindNodesByTagName(xmlNodePtr ptr_array[], xmlNodePtr a_node, char tagname[]){

**ptr_array = cur_node;
// becomes
*ptr_array = cur_node;

(*ptr_array)++;
// becomes
ptr_array++;

我发现 xmlNodePtr 是对 xmlNode * 的伪装,令人厌恶。为了解决这个问题,我做的第一件事就是将所有 xmlNodePtr 转换为 xmlNode *

看看这些变化,我将大部分困惑归咎于 xmlNodePtr。不管怎样,请记住,像 void foo(int bar[])void foo(int * bar) 是一样的。希望您能从 diff 中看到哪里出了问题。

关于c - 使用 libxml2 传递指针来搜索 xmlTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19801642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com