2017-06-15 60 views
0

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

以下是一些例子(考虑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]

只有元素名称应该受到影响,表达式的其余部分(函数,操作符,值等)应该保持相同 - 或者,如果他们改变了,他们应该保持等同。

我该如何做到这一点?

  • XPathParser库:除了有显著的错误,它迫使你重建的XPath

    虽然试图在C#中解决这个问题我在2个不同的解决方案,这两者都是不适合我的情况不够好,来了一点一点的表达,这是矫枉过正,而不是真的是我需要

  • RegEx:这可能是一种可能性,但在该线程建议的解决方案不能够正确处理一些XPath的例子上述
+1

重建xpath表达式听起来不像是一种矫枉过正。用正则表达式解析它。 –

+0

@WiktorStribiżew:[this](https://github.com/quamotion/XPathParser/blob/master/XPathParserTest/XPathStringBuilder.cs)是XPathParser库中的一个示例,它显示了重新构建XPath的方式。我发现即使这个例子本身也有错误。此外,它涉及处理其他很多我不太关心的部分,理想情况下我只想处理元素名称。也许还有另一个XPath解析器比这个更好? –

+0

@GabrielS。重构XPath是正确的解决方案;使用正则表达式是一种无疑无法在某些情况下工作的黑客攻击。如果“黑客”解决方案足够满足您的需求(这是一次性脚本还是生产代码?),那就去做吧;否则我会建议正确地做。什么是“重大错误”? –

回答

2

如果您希望这可以在任何XPath表达式上正常工作,那么确实没有任何方法可以根据XPath语法解析表达式。例如,这是唯一的方法,您可以计算出需要将表达式and and or or and转换为x:and and x:or or x:and。如果你认为无bug程序是一种难以负担的奢侈品,那只会是过火。