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