如何使用libyang解析LYS_ANYXML类型YANG数据并提取sync-state
解析LYS_ANYXML类型YANG数据获取sync-state值
因为目标节点的schema类型是LYS_ANYXML,libyang会将其内容作为未解析的原始XML块存储,而非标准的lyd_node子节点结构,所以直接调用lyd_child()会返回NULL。需要通过以下步骤解析:
步骤1:定位ANYXML节点
先通过lyd_child()找到包含ANYXML内容的sync节点:
lyd_node *sync_node = lyd_child(op, "urn:ietf:params:xml:ns:netconf:base:1.0", "data"); sync_node = lyd_child(sync_node, "urn:o-ran:sync:1.0", "sync");
步骤2:提取ANYXML的原始XML结构
使用lyd_anyxml_get()函数获取ANYXML节点对应的XML解析树(lyxml_elem类型):
if (sync_node && sync_node->schema && sync_node->schema->nodetype == LYS_ANYXML) { lyxml_elem *anyxml_root = lyd_anyxml_get(sync_node);
步骤3:遍历XML树查找sync-state节点
遍历lyxml_elem结构的子节点,定位到sync-state并提取其文本值:
if (anyxml_root) { // 查找sync-status节点 lyxml_elem *sync_status = NULL; for (lyxml_elem *child = anyxml_root->children; child; child = child->next) { if (child->ns && !strcmp(child->ns->uri, "urn:o-ran:sync:1.0") && !strcmp(child->name, "sync-status")) { sync_status = child; break; } } if (sync_status) { // 查找sync-state节点 lyxml_elem *sync_state_node = NULL; for (lyxml_elem *child = sync_status->children; child; child = child->next) { if (child->ns && !strcmp(child->ns->uri, "urn:o-ran:sync:1.0") && !strcmp(child->name, "sync-state")) { sync_state_node = child; break; } } if (sync_state_node && sync_state_node->text) { // 将值存入变量 char sync_state_val[64] = {0}; strncpy(sync_state_val, sync_state_node->text, sizeof(sync_state_val) - 1); // 此时sync_state_val即为"LOCKED" } } } }
注意事项
- 必须严格匹配节点的命名空间URI(
urn:o-ran:sync:1.0),避免不同命名空间下的同名节点干扰。 - 处理文本内容时注意内存边界,防止缓冲区溢出。
- 可以将XML节点查找逻辑封装为通用函数,提升代码复用性。
内容的提问来源于stack exchange,提问作者Mohammed Safwan
相关产品推荐
相关产品推荐

