You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:05:25