【发布时间】: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”处理。它错误地解析带有某些运算符的表达式,例如联合。一些带括号的函数存在问题。里面可能潜伏着更多的错误,这些只是我目前发现的。
标签: c# regex xml parsing xpath