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

使用XmlDocument读取XML时如何保留
、
不被自动转义

原因说明

XmlDocument 加载XML内容时默认会自动解析属性中的字符实体引用,比如你例子里的
、
会被直接转为对应的回车、换行控制字符,直接读取XmlAttribute.Value属性只能拿到转义后的结果,要获取原始未转义的实体文本,可以用以下两种方案实现:


方案1:自定义XmlReader配置(推荐,符合XML规范)

通过调整XmlReader的实体处理规则,不自动展开字符实体,加载到XmlDocument后手动拼接属性的原始内容:

// 这里替换为你自己的原始XML字符串/输入流
string rawXml = @"<xml>
  <item content=""abcd &#xD; abcd &#xA; abcd"" />
</xml>";

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.DtdProcessing = DtdProcessing.Ignore; // 禁用DTD处理避免安全风险
readerSettings.EntityHandling = EntityHandling.None; // 核心配置:不展开任何实体引用

XmlDocument xmlDoc = new XmlDocument();
using (XmlReader reader = XmlReader.Create(new StringReader(rawXml), readerSettings))
{
    xmlDoc.Load(reader);
}

XmlAttribute contentAttr = xmlDoc.SelectSingleNode("/xml/item").Attributes["content"];
StringBuilder rawContentBuilder = new StringBuilder();
// 遍历属性的子节点拼接原始内容
foreach (XmlNode node in contentAttr.ChildNodes)
{
    if (node.NodeType == XmlNodeType.Text)
    {
        rawContentBuilder.Append(node.Value);
    }
    else if (node.NodeType == XmlNodeType.EntityReference)
    {
        rawContentBuilder.Append($"&{node.Name};");
    }
}
// 最终得到的rawContent就是未转义的原始属性值
string rawContent = rawContentBuilder.ToString();

该方案适用于XML结构复杂、属性位置不固定的场景,兼容性最强。


方案2:正则匹配原始XML(简单高效,适合固定格式场景)

如果你的XML格式是固定的,不需要处理复杂的嵌套、转义场景,可以直接从原始XML字符串中正则匹配提取属性的原始值:

// 这里替换为你自己的原始XML字符串
string rawXml = @"<xml>
  <item content=""abcd &#xD; abcd &#xA; abcd"" />
</xml>";

// 正则匹配content属性的原始值,属性用单引号的话调整正则里的引号即可
var match = System.Text.RegularExpressions.Regex.Match(rawXml, @"<item\s+content=""([^""]+)""", RegexOptions.IgnoreCase);
if (match.Success)
{
    string rawContent = match.Groups[1].Value;
}

内容的提问来源于stack exchange,提问作者WPInfo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:54:03