ZBLOG

如何判断node的标签类型

Gumbo 中判断一个节点的标签类型(GumboTag),需要通过以下步骤:


1. 确认节点类型

首先检查节点是否为 元素节点(其他类型如文本、注释等无标签概念):

if (node->type != GUMBO_NODE_ELEMENT) {
    return; // 非元素节点,无需处理
}

2. 获取标签枚举值

通过 node->v.element.tag 访问元素的标签类型:

GumboTag tag = node->v.element.tag;

3. 常用判断方式

(1) 直接比较枚举值

if (tag == GUMBO_TAG_A) {
    printf("这是一个 <a> 链接标签\n");
} else if (tag == GUMBO_TAG_IMG) {
    printf("这是一个 <img> 图片标签\n");
}

(2) Switch-case 结构(适合多分支)

switch (tag) {
    case GUMBO_TAG_DIV:
        handle_div(node);
        break;
    case GUMBO_TAG_P:
        handle_paragraph(node);
        break;
    default:
        printf("未知标签: %d\n", tag);
}

(3) 动态获取标签名(调试用)

const char* tag_name = gumbo_normalized_tagname(tag);
printf("当前标签名: %s\n", tag_name); // 输出如 "div", "img"

4. 完整示例代码

#include <gumbo.h>
#include <stdio.h>

void inspect_node(GumboNode* node) {
    if (node->type != GUMBO_NODE_ELEMENT) {
        return;
    }

    GumboElement element = node->v.element;
    const char* tag_name = gumbo_normalized_tagname(element.tag);

    printf("发现元素: <%s>\n", tag_name);

    if (element.tag == GUMBO_TAG_A) {
        GumboAttribute* href = gumbo_get_attribute(&element.attributes, "href");
        if (href) {
            printf("  链接地址: %s\n", href->value);
        }
    }
}

void walk_tree(GumboNode* node) {
    inspect_node(node);

    if (node->type != GUMBO_NODE_ELEMENT) {
        return;
    }

    for (int i = 0; i < node->v.element.children.length; ++i) {
        walk_tree(static_cast<GumboNode*>(node->v.element.children.data[i]));
    }
}

关键注意事项

  1. 区分大小写
    Gumbo的标签枚举(如 GUMBO_TAG_IMG)严格遵循HTML5规范,均为大写简写形式。

  2. 特殊标签处理

    • <script>GUMBO_TAG_SCRIPT
    • <svg>GUMBO_TAG_SVG(需注意命名空间)
  3. 性能优化

    • 频繁使用的标签比较建议直接用枚举值,而非字符串比较。

如需进一步验证,可查阅 Gumbo官方源码


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23397

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?