2013-04-22 101 views
1

我正在C#中編寫代碼,我需要根據條件查找子節點並替換其值。XPATH:具有文本或具有特定值的任何屬性的節點

什麼是可供選擇:

  1. XML節點
  2. 佔位=字符串,表示佔位符
  3. replacementString =佔位符字符串需要以該字符串

什麼是要被替換完成:

  1. 查找文本=佔位符 或與任何屬性havingvalue節點=佔位符串

  2. 如果節點,指派內部文本= replacementString的XML節點的孩子。 如果屬性,與replacementString

迄今取得的進展替換屬性值:

我能找到佔位符使用XPath文本節點

descendant::*[text()='placeHolder'] 

但我現在在佔位符可以作爲屬性值存在的情況下附加了規則。

限制:

它需要的可以在的SelectSingleNode中使用XPath的實現。這是有保證的,可以有一個與定的佔位符唯一節點/屬性

備選:

我知道我能得到的XMLNode的字符串,執行字符串替換,在DOM加載和獲取文檔元件。但我不想在內存中爲字符串替換創建另一個DOM。

由於已經

+0

如果你給我的'xml'樣品這將是很好,而我可以提供你需要的XPATH表達式。 – 2013-04-22 12:08:10

+0

@RubyLovely:這是問題的一部分,因爲我不知道我應該執行替換的XML的結構。標記的答案適用於我的目的 – 2013-04-24 05:51:36

回答

0

鑑於

XmlNode foo; 
string placeHolder, replacement; 

,你應該能夠使用

XmlNode rep = foo.SelectSingleNode(string.Format("//@*[. = '{0}'] | //text()[. = '{0}']", placeHolder)); 
if (rep != null) { 
    rep.InnerText = replacement; 
} 

XmlText以及XmlAttribute有一個可設置InnerText屬性。

[編輯]如果節點foo是一個更大的文檔的一部分,那麼最好是在XPath的改變

XmlNode rep = foo.SelectSingleNode(string.Format(".//@*[. = '{0}'] | .//text()[. = '{0}']", placeHolder)); 
相關問題