更改 XPath 表达式中的元素名称

Posted

技术标签:

【中文标题】更改 XPath 表达式中的元素名称【英文标题】:Altering element names in an XPath expression 【发布时间】:2017-11-17 23:04:57 【问题描述】:

我正在寻找一种以编程方式更改任何给定 XPath 1.0 表达式的方法,即表达式中尚未加前缀的元素名称必须以预定义的字符串作为前缀。

以下是一些示例(将bk 视为预定义前缀):

book 必须变为 bk:book

/bookstore/book/title 必须变为 /bk:bookstore/bk:book/bk:title

//book/title/text() 必须变为 //bk:book/bk:title/text()

/x:bookstore/book/ 必须变为 /x:bookstore/bk:book/

/bookstore/book[price>35.00] 必须变为 /bk:bookstore/bk:book[bk:price>35.00]

child::para[attribute::type='warning'][position()=5] 必须变为 child::bk:para[attribute::type='warning'][position()=5]

只有元素名称应该受到影响,表达式的其余部分(函数、运算符、值等)应该保持不变 - 或者,如果它们发生变化,它们应该保持相同。

我怎样才能做到这一点?

在尝试用 C# 解决这个问题时,我遇到了 2 种不同的解决方案,这两种解决方案都不适合我的场景:

XPathParser 库:除了有严重的错误之外,它还迫使您一点一点地重构 XPath 表达式,这有点矫枉过正,并不是我真正需要的 RegEx:这可能是一种可能性,但是该线程中建议的解决方案无法正确处理上面的某些 XPath 示例

【问题讨论】:

重新构建 xpath 表达式听起来并不像矫枉过正。用正则表达式解析它。 @WiktorStribiżew:this 是 XPathParser 库中的一个示例,它展示了如何重构 XPath。我发现即使是示例本身也有错误。此外,它涉及处理许多我并不真正关心的其他部分,理想情况下我只想处理元素名称。也许还有另一个 XPath 解析器比这个更好? @GabrielS。重构 XPath 是正确的解决方案;使用正则表达式是一种技巧,在某些情况下无疑是行不通的。如果“hack”解决方案足以满足您的需求(这是一次性脚本还是生产代码?),那就去吧;否则我建议正确地做。什么是“重大错误”? 这不是 RegEx 的工作。我不知道的工作是什么,但它不是正则表达式。 @TomLord:它错误地将“self”轴作为“child”处理。它错误地解析带有某些运算符的表达式,例如联合。一些带括号的函数存在问题。里面可能潜伏着更多的错误,这些只是我目前发现的。 【参考方案1】:

如果您希望它在任何 XPath 表达式上正常工作,那么实际上没有任何替代方法可以根据 XPath 语法解析表达式。这是唯一的方法,例如,您可以计算出表达式and and or or and 需要转换为x:and and x:or or x:and。如果您将无错误程序视为一种负担不起的奢侈品,那只是矫枉过正。

【讨论】:

以上是关于更改 XPath 表达式中的元素名称的主要内容,如果未能解决你的问题,请参考以下文章

动态更改绑定元素的 xpath 表达式

Xpath路径表达式

xpath路径表达式笔记(转载)

XPath路径表达式笔记(转载)

xpath路径表达式笔记

selenium自动化测试之元素定位二(xpath定位)