1

在创建 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 次。

4

1 回答 1

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属性。如何到达节点的示例包括此答案和此处的MSDN 文档

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

string messageToLog = messageDocument.ToString();

这使您可以准确指定要替换的内容。

如果您想决定是使用 XmlDocument 还是 XDocument,我建议您阅读这个问题的答案

于 2013-08-09T13:39:15.937 回答