我有下面的程序来标记 Xpath 表达式。但它无法处理这样的表达式:
/employees/employee[secret-code=a/b/c][unicode=d/e/f]/salary
基本上通过“/”进行标记化,因为谓词本身包含“/”。
const char *g_xpath_node_delim = "/";
static void tokenize_xpath (char *xpath_str)
{
const char *tok = NULL;
if (!xpath_str)
return;
while ((tok = strsep(&xpath_str, g_xpath_node_delim)) != NULL) {
if (tok[0] == '\0')
continue;
fprintf(stdout, "\nToken '%s'\n", tok);
}
}
我想构造一个节点结构及其谓词。有什么提示吗?
XPath 有一个相当复杂的语法(我不会进入任何计算机科学的语法类,因为我自己对这个主题很模糊),但它是一个递归定义的语法,这意味着你无法对表达式进行正确的分析具有基于正则表达式的单级分词器的结构。您需要一个真正的 XPath 解析器来构建语法树。根据您想要实现的目标以及您想要投入多少精力,您可以尝试利用现有的开源 XPath 解析器,也可以编写自己的解析器。