2013-04-22 104 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)); 
相关问题