2017-06-15 40 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程序是一種難以負擔的奢侈品,那隻會是過火。