libxml2使用xpath寻找节点

最近做项目总是有解析xml的需求,而迅速定位到所需节点然后进行读取、修改、删除操作是常有的事情,为此,我学习了xpath的用法,总结如下:
首先,libxml2的官方文档被墙了,只能百度。找到一篇文章:https://www.cnblogs.com/catgatp/p/6505427.html
文章里介绍的方法很实用,我拿过来修改后自己测试并调整。

示例代码如下,参照着使用就行了。

#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xpath.h>

/**
 * @brief xpathxml

 * 
 * @param doc xmlָ
 * @param xpath ath

 * @return xmlXPathObjectPtr LLָlXPathFreeObject

 */
static xmlXPathObjectPtr xml_get_nodeset(xmlDocPtr doc, const xmlChar *xpath)
{
    xmlXPathContextPtr context;
    xmlXPathObjectPtr result;
    context = xmlXPathNewContext(doc);

    if (context == NULL)
    {
        printf("context is NULL\n");
        return NULL;
    }

    result = xmlXPathEvalExpression(xpath, context);
    xmlXPathFreeContext(context);
    if (result == NULL)
    {
        printf("xmlXPathEvalExpression return NULL\n");
        return NULL;
    }

    if (xmlXPathNodeSetIsEmpty(result->nodesetval))
    {
        xmlXPathFreeObject(result);
        printf("nodeset is empty\n");
        return NULL;
    }

    return result;
}

int main(int argc, char const *argv[])
{
    xmlDocPtr doc = xmlReadFile("./test.xml", "utf-8", XML_PARSE_NOBLANKS);
    if (NULL == doc)
    {
        return -1;
    }
    xmlChar *xpath = BAD_CAST "//name";
    xmlXPathObjectPtr result = xml_get_nodeset(doc, xpath);
    if (NULL == result)
    {
        xmlFreeDoc(doc);
        return -1;
    }

    xmlNodeSetPtr nodeset = result->nodesetval;
    xmlNodePtr cur = NULL;

    for (int i = 0; i < nodeset->nodeNr; i++)
    {
        cur = nodeset->nodeTab[i];
                xmlChar *name = xmlNodeGetContent(cur);
                printf("find:%d %s\n", i, name);
                xmlFree(name);
    }

    xmlXPathFreeObject(result);

    xmlFreeDoc(doc);

    return 0;
}

值得一提的是xpath有自己的语法,可百度。可参考:https://www.w3school.com.cn/xpath/xpath_syntax.asp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值