2011-01-10 71 views
0

我想檢索具有包含給定字符串的一個或多個屬性的所有RULE節點。一旦我找到他們,我需要用一個新的替換字符串。 我測試的XPath查詢,但他們不工作:檢索屬性包含給定字符串的所有節點

string xpathquery = "/FIREWALL/ETH/RULE[contains(@*,'" + toTest + "')]"; //DOES NOT WORK 
string xpathquery = "/FIREWALL/ETH/RULE[contains(attribute::*,'" + toTest +"')]"; //DOES NOT WORK 

奇怪的是,如果我使用@attributename或屬性:: ATTRIBUTENAME它的實際工作。錯誤在哪裏?

我現在用的是函數,因爲可能有兩種不同的情況,比方說,我想和$ HOST2更換$ HOST1:

<RULE .... host="$HOST1"/> //NO PROBLEM 
<RULE .... host="$HOST1:21"/> //I NEED TO REPLACE ONLY $HOST1, NOT THE ENTIRE STRING 

我不能只設置XmlNode的,但我的價值屬性需要修改字符串。其實我不知道XPath是否可以通過查找和替換或類似的方式來處理這個問題。

+3

你絕對* *要使用XPath這個?就我個人而言,我會直接使用LINQ到XML,但顯然這是你的電話... – 2011-01-10 14:37:25

+0

那麼,如果有一個更簡單的LINQ解決方案...請記住,我從來沒有用過它,但我可以學習:)爲了我可以有看起來它看起來像一個類似於SQL的查詢語言,對嗎? – raz3r 2011-01-10 14:41:08

回答

0

您正在使用的查詢將檢查所有屬性的連接文本。正確的語法是:

string xpathquery = "/FIREWALL/ETH/RULE/@*[contains(.,'" + toTest + "')]/.."; 

換句話說,找到一個匹配的屬性並返回它的父元素。當然,如果你想要做的是使用屬性值,你最終可以省去/..,在這種情況下,你將返回實際的屬性節點,並且可以通過迭代它們來修改相應的值。

+1

或等同地,/ FILEWALL/ETH/RULE [@ * [包含(。,'+ toTest +「')]]」。但是請注意,通過字符串連接構造XPath表達式是一種壞習慣,因爲它會讓您打開注入式攻擊。如果您使用的API允許,最好使用變量並綁定來自調用API的變量。 – 2011-01-10 16:24:25

0

標準XPath函數需要一個字符串作爲其第一個參數。當第一個參數是節點列表時(與你的情況一樣),只使用所提供節點集中第一個節點的字符串值。這就是你如何得到你當前的結果。

解決方案

/FIREWALL/ETH/RULE/@*[contains(.,' + toTest + ')] 
相關問題