You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Netopeer2客户端接收的lyd_node*中获取叶子节点值

解决libyang lyd_find_path() 返回LY_ENOTFOUND的问题

以下是针对你遇到的问题的排查方向和解决方案:

1. 检查命名空间前缀绑定

  • 确认你的lyd_node上下文已正确加载etsi-qkd-sdn-node对应的YANG模型,且前缀与命名空间URI完成绑定。可以通过ly_ctx_get_module()验证模型是否加载成功,或者用lyd_print_mem()打印整个数据树,核对实际返回节点的命名空间是否与你使用的前缀匹配。
  • 如果前缀未绑定,有两种解决方式:
    • 调用lyd_find_path()前,用ly_ctx_set_ns()手动绑定前缀与URI:ly_ctx_set_ns(op->ctx, "etsi-qkd-sdn-node", "http://你的实际命名空间URI");
    • 直接在路径中使用完整命名空间URI替代前缀,比如路径写成/{http://你的实际命名空间URI}/qkd_node/qkdn_version

2. 核对路径层级与节点名

  • 对照YANG模型,确认qkd_node是顶层容器、qkdn_version是其直接叶子节点,且节点名无拼写错误(注意大小写、下划线等细节)。
  • 先打印完整的lyd_node数据树,确认服务器返回的节点结构与你预期一致——比如某些节点可能因YANG的when条件、presence容器规则未被实例化,导致路径不存在。

3. 确认起始节点上下文

  • 检查传入lyd_find_path()的op节点是否为get-config响应的正确起始点:Netopeer2的get-config响应通常以data节点为根,你需要先定位到data子节点,再以此为上下文查找目标路径。示例:
// 先定位到data节点
lyd_node *data_node = lyd_child(op, NULL);
if (!data_node) {
    // 处理节点不存在的错误
}

// 以data_node为上下文查找目标叶子
lyd_node *match = NULL;
LY_ERR ret = lyd_find_path(data_node, "/etsi-qkd-sdn-node:qkd_node/qkdn_version", 0, &match);

4. 检查libyang版本兼容性

  • 不同版本的libyang在路径解析逻辑上可能存在差异,比如旧版本对前缀处理更严格。确认你使用的libyang版本与Netopeer2的依赖版本匹配,必要时升级到兼容的稳定版本。

提取叶子节点值的示例代码

当成功找到节点后,可通过以下方式提取值:

if (ret == LY_SUCCESS && match) {
    // 提取字符串类型值
    const char *value = lyd_get_value(match);
    // 业务逻辑处理...
    
    lyd_free(match); // 注意释放资源
}

内容的提问来源于stack exchange,提问作者Sam Kore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:43:15