在 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]));
}
}
关键注意事项
区分大小写:
Gumbo的标签枚举(如GUMBO_TAG_IMG
)严格遵循HTML5规范,均为大写简写形式。特殊标签处理:
<script>
→GUMBO_TAG_SCRIPT
<svg>
→GUMBO_TAG_SVG
(需注意命名空间)
性能优化:
- 频繁使用的标签比较建议直接用枚举值,而非字符串比较。
- 频繁使用的标签比较建议直接用枚举值,而非字符串比较。
如需进一步验证,可查阅 Gumbo官方源码。
内容由零声教学AI助手提供,问题来源于学员提问