如何在不更改任何其他内容的情况下仅替换XML文档中的特定值?

时间:2013-08-09 13:32:23

标签: c# .net xml regex string

在创建XML的消息日志之前,我一直在尝试从内存中的xml文档替换特定值。

我设法做了替换,但Regex替换方法似乎也替换了其他项目。

我必须让它比我想要的更加时髦,但文档中的元素可以包含不同的XML命名空间......

string pattern = "(<).*?(ElementName>).*?(<\\/).*?(ElementName>).*?";

string replacementPattern = "(<).*?(ReplacedElementName>)xxxxxxxxxxxxxx(<\\/).*?(ReplacedElementName>).*?";

string messageToLog = Regex.Replace(messageToSanitise, pattern, replacementPattern);

有谁可以指出我哪里出错?

[更新16:11 BST 09/08/2013]

感谢Dash,我试图这样做,但后来我意识到该对象包含一个xml并且实际上并不是一个xml文档本身,看起来该对象有一些标题,xml在文档信封内。理想情况下,我不想在记录之前丢失任何信息(包括标题)。我试图改变的元素总会有1或2次出现,而且永远不会少于1。

1 个答案:

答案 0 :(得分:2)

鉴于您的xml位于字符串messageToSantise中,您可以尝试以下操作:

使用XmlDocument:

(旧版本框架中常见的经典XML解析,以及旧版本的唯一选择)

XmlDocument messageDoc = new XmlDocument();
messageDoc.Load(messageToSanitise);
messageDoc.SelectSingleNode(path_to_node).Value = replacementValue

path_to_node可以与相应的XPath表达式一起使用。

要从xmlDocument中取回xml字符串,请使用messageDoc.OuterXml属性。

string messageToLog = messageDoc.OuterXml;

使用XDocument:

(通过LINQ样式机制解析xml,在新版本的框架中受支持)

XDocument messageDocument = new XDocument();
messageDocument.Parse(messageToSanitise);
messageDocument.Element(path_to_element).value = replacementValue;

要浏览XDocument,您可能还希望使用Descendents属性。有关如何到达节点的示例包括此answer和此处的MSDN documentation

要从XDocument获取Xml,请使用messageDocument.ToString();

string messageToLog = messageDocument.ToString();

这允许您准确指定要替换的内容。

如果您想决定是使用XmlDocument还是XDocument,我建议您阅读answer to this question