2012-10-01 33 views
1

我知道這是一個奇怪的問題!如何使用XPath僞造不存在的XML節點?

該要求是由於現有代碼期望XPath查詢的結果爲單個節點。不幸的是,由於我們控制之外的因素,我們無法對代碼進行更改(除非沒有解決方法,這可能意味着我們將不得不推遲發佈)。

以我的情況下,目前的XPath返回一個整數值(計數):

count(/someNode/node) 

代碼使用XPathNavigator.SelectSingleNode()方法,其中,當然,失敗,因爲結果不是節點。

相反,我需要XPath返回一個節點,雖然是假的。可能嗎?請注意,因爲使用了.NET,所以XPath必須是1.0(不是2.0)。

P.S.而且,是的,我們將着眼於重構ASAP問題!

+0

我想必須有一些其他的要求,我錯過了。如果您只需要XPath返回節點,則可以將XPath更改爲「/」。你真的需要你的XPath來返回一個節點*,它的文本內容等於'count(/ someNode/node)'*的值嗎? – LarsH

+1

順便說一句問題的有用性。我經常希望能夠在XPath中構建一個節點。當然,如果你能做到這一點,所有的花裏胡哨的事情,你會接近複製XSLT。 :-) – LarsH

回答

2

如果您需要XPath表達式返回其文本內容等於count(/someNode/node)值一個節點,你可以做這樣的:

"(//text() | //*/@*)[. = count(/someNode/node)]" 

這可能是非常低效的,這取決於你的輸入文件就像;如果輸入文檔中沒有包含正確數字的文本節點,它可能會失敗。但是在某些情況下它可以做到這一點,並可能幫助您避免延遲發佈。例如,如果輸入的XML很小,並且count(...)的可能值範圍有限,並且您可以對XML進行更改,則可以在輸入中包含額外的文本或屬性節點XML以確保所需的數字可用。

+1

謝謝,@LarsH。這是一個有趣/有創意的想法。不幸的是,計數值出現在文檔中的可能性很小,我們也無法控制傳入的XML。 –

+1

雖然這不能解決問題(由於設計中的XPath限制),但這種方法絕對非常接近可行的解決方案。 –

+0

@IgorPashchuk,感謝慷慨的接受。 :-) – LarsH

2

的XPath選擇輸入文檔中的節點,它不能創建新的或「假」的人,所以我認爲,如果你想計算表達式count(/someNode/node)您需要使用Evaluate方法http://msdn.microsoft.com/en-us/library/2c16b7x8.aspx,而不是SelectSingleNode

+0

謝謝,馬丁。 Evaluate()方法的確是我將用於這種情況。 –

相關問題