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

标签 c xml pointers libxml2

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

相关文章:

c - 在c中重定向到多个tty

C 生产者/消费者应用程序使用 getenv() 获取环境变量不起作用

c - C/* */注释中的正斜杠 "/"

xml - 在 xsi :type attribute belong? 中对哪个 XML 命名空间使用非限定名称

Java Xpath 查询编译失败

c++ - 指向未指定大小 "(*p)[]"的数组的指针在 C++ 中非法但在 C 中合法

c - C中的_Thread_local存储类说明符?

xml - 如何让 Powershell 更快地解析 XML 或进一步优化我的脚本?

c++ - 指针作为成员变量

c++ - 处理包含动态分配成员的对象的 vector