XPath表达式分词问题求助:无法处理谓词含斜杠的表达式
解决方案思路
1. 用状态机跟踪谓词上下文
不能简单按/分割,必须跟踪当前是否处于谓词内部([]包裹的区域):
- 定义两种状态:
OUTSIDE_PREDICATE(初始状态)和INSIDE_PREDICATE - 遍历字符串每个字符:
- 遇到
[时切换到INSIDE_PREDICATE,此时忽略/的分隔作用 - 遇到
]时切回OUTSIDE_PREDICATE - 仅在
OUTSIDE_PREDICATE状态下,/才作为分隔符切割token
- 遇到
2. 手动切割字符串,替代strsep的简单分割
放弃strsep自动分割,手动遍历维护token起始位置:
- 初始化
start指向字符串首地址 - 逐个字符遍历:
- 处于
OUTSIDE_PREDICATE且当前字符是/时,截取start到当前字符前的内容作为一个token(跳过空token,比如开头的/) - 更新
start为当前字符的下一个地址
- 处于
- 遍历结束后,处理最后一段从
start到末尾的token
3. 构建节点+谓词的结构化存储
分词完成后,将每个token拆分为节点名和谓词列表:
- 提取节点名:从token开头到第一个
[的部分(如employee) - 提取谓词:遍历token中的
[和]配对,将每个[]内的内容作为独立谓词项(如secret-code=a/b/c、unicode=d/e/f) - 可定义结构体存储:
typedef struct { char *node_name; char **predicates; // 动态数组存储谓词字符串 int predicate_count; } XPathNode;
4. 处理边界情况
- 开头的
/:标记为绝对路径,跳过空token - 嵌套谓词(若需兼容):用计数器跟踪,
[计数+1,]计数-1,仅当计数为0时才视为谓词结束 - 空谓词(如
employee[]):按需做合法性校验或特殊处理
内容的提问来源于stack exchange,提问作者Ram P
相关产品推荐
相关产品推荐

