如何避免XAttribute.SetValue对已转义XML属性值重复转义?
解决XAttribute.SetValue二次转义的问题
这个问题我之前也碰到过,确实挺头疼的——XAttribute.SetValue默认会把所有输入都当成纯文本,不管里面有没有已经转义好的XML实体,都会重新转义一遍,导致出现"这种二次转义的结果。
要解决这个问题,核心思路是告诉.NET:“这个输入已经是符合XML规范的内容了,别再转义它”。这里有个靠谱的实现方法,借助XmlDocument的XmlAttribute.InnerXml属性来处理,它能智能区分原始文本和已转义的XML内容:
private void SetValue(XAttribute attribute, string input) { // 创建临时的XmlDocument和元素,用来处理属性值 var xmlDoc = new XmlDocument(); var tempElement = xmlDoc.CreateElement("temp"); // 创建对应名称的XmlAttribute var xmlAttribute = xmlDoc.CreateAttribute(attribute.Name.LocalName); // 关键:用InnerXml赋值,它会自动处理两种情况: // 1. 如果输入是原始文本(比如Hello "World"),会自动转义成合法的XML属性值 // 2. 如果输入已经是转义后的内容(比如Hello "World"),会直接保留,不二次转义 xmlAttribute.InnerXml = input; // 将属性添加到临时元素 tempElement.Attributes.Append(xmlAttribute); // 把XmlDocument的元素转换成XElement,提取处理后的属性值 using var reader = new XmlNodeReader(tempElement); var xTempElement = XElement.Load(reader); var processedValue = xTempElement.Attribute(attribute.Name.LocalName)?.Value; if (processedValue != null) { attribute.SetValue(processedValue); } }
为什么这个方法有效?
XmlAttribute.InnerXml的行为和SetValue不同:它会把输入当作XML片段来解析,而不是纯文本。- 当输入是原始文本(带未转义的引号、&等),它会自动转义成合法的XML实体;
- 当输入已经是转义后的XML实体(比如
"),它会直接保留这些实体,不会再次转义&符号。
这样不管用户输入的是原始文本还是已经转义好的内容,最终的XML属性值都会符合你的预期。
内容的提问来源于stack exchange,提问作者Tomtom
相关产品推荐
相关产品推荐

