2012-04-12 40 views
0

我傳遞一個XPath表達式到的XmlDocument和調用的SelectNodes(表達) - 我想只返回字符串。到目前爲止,我試過如何獲取一個節點的子XPath表達式

substring(//Container/__name,2) 
substring(//Container/__name/text(),2) 
//Container/__name/substring(.,2) 
//Container/__name/text()/substring(.,2) 

(你可以看到我越來越絕望)。

他們的所有錯誤(「表達式必須計算節點集合」)

//容器/ __名/文()的作品,順便(和它的6個字符)。

什麼是正確的方法來做到這一點?

編輯: 這裏是確切的代碼(沒有什麼太壯觀了)

nodeList = xdoc.SelectNodes(xpathBox.Text); 

我真的想拿出一個純粹的XPath的解決方案 - 這是一個工具,它允許一個XML文檔被修改提供一個xpath表達式和一個字符串 - 該字符串替代了由xpath表達式選擇的節點中的文本。我希望能夠做部分替換。所以,如果有什麼這是不可能的,是有關於如何最優雅的完成我的目標有何建議:用一個字符串替換文本節點的一部分,只使用XPath表達式和一個字符串。另一個功能也許?

回答

1

如果XPath的評價結果​​不是一個節點集使用Evaluate,而不是比SelectNodes

string substr = xdoc.CreateNavigator().Evaluate("substring(//Container/__name,2)") as string; 

要修改所有的__name元素,你可以不喜歡裏面的文字這個:

foreach (XmlNode node in xdoc.SelectNodes("//Container/__name")) { 
    XmlElement nameElement = node as XmlElement; 
    nameElement.InnerText = nameElement.InnerText.Substring(2); 
    } 
+0

我一直在慢慢地搞清楚如何使用Evaluate(),但它看起來像一個)臨屋區t並沒有完全實現我想要做的事情,b)也許這是不可能做到我想要做的。 – Aerik 2012-04-19 04:55:27

+0

我看到 - 如果你有一個評估特定問題()後,我用它了很多...如果它是不可能做你正在嘗試做的,好了,對不起! – MiMo 2012-04-19 07:38:05

+0

感謝MiMo,這是一個觀察(也許暗含的問題),而不是投訴。 – Aerik 2012-04-19 18:53:25

0

的問題是,在那裏你想執行這個。返回值是作爲一個節點集預期的,並且您試圖返回一個字符串。

您需要先返回的節點,然後只在其上執行字符串函數。

一旦你的text()節點返回到您的代碼,在這裏你可以查看它的6個字符,你可以運行在該子?

var new = old.Substring(1,2)