gpt4 book ai didi

html - 我们可以使用正则表达式使用 libxml2 查找具有特定属性值的所有节点吗?

转载 作者:行者123 更新时间:2023-11-30 17:01:30 26 4
gpt4 key购买 nike

您好,我正在使用 libxml2 来解析 HTML。我想检查给定的节点是否具有特定属性。

但就我而言,我想检查具有特定属性的节点(我可以提供与多个属性而不是属性名称匹配的正则表达式吗?)

libxml2 API 用于检查给定节点是否具有该属性?

xmlAttrPtr xmlHasProp(const xmlNode * node, 
const xmlChar * name)

我正在寻找如下方式:

xmlAttrPtr xmlHasProp(const xmlNode * node, 
const char * attributeNameRegex)

这样我就可以检查具有多个属性的节点。例如我想检查节点是否具有“onClick”或“onmouseover”或“onmouseclick”类型的属性?

最佳答案

一种解决方案是使用 XPath,但 libxml2 既不支持 XPath 2.0,也不支持 EXSLT 正则表达式扩展。 libxml2 附带其 own XML Schemas compatible regex module , 尽管。像下面这样的东西应该有效:

int xmlHasMatchingProp(const xmlNode *node,
const xmlChar *attrNameRegex) {
xmlRegexpPtr regex;
xmlAttrPtr attr;

if (node == NULL || node->type != XML_ELEMENT_NODE)
return 0;

regex = xmlRegexpCompile(attrNameRegex);
if (regex == NULL)
return 0;

for (attr = node->properties; attr != NULL; attr = attr->next) {
if (xmlRegexpExec(regex, attr->name) == 1)
break;
}

xmlRegFreeRegexp(regex);
return attr ? 1 : 0;
}

但是如果您只想检查属性名称是否以“on”开头,您可以简化上面的代码,使用 xmlStrncasecmp例如:

for (attr = node->properties; attr != NULL; attr = attr->next) {
if (xmlStrncasecmp(attr->name, "on", 2) == 0)
break;
}

关于html - 我们可以使用正则表达式使用 libxml2 查找具有特定属性值的所有节点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37018058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com