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

C#使用XmlTextReader读XML报EntityName解析错误如何解决

不规范XML特殊字符解析报错解决方案

XML规范要求&必须转义为&才属于合法内容,标准XML解析器默认会严格校验格式,你遇到的An error occurred while parsing EntityName报错就是未转义的&触发的格式校验错误,可通过以下几种方案解决:

方案1:预处理XML内容(最稳妥)

送入解析前先对XML内容做字符修正,替换所有独立的未转义&,同时避开已经正确转义的XML实体(</>/&/"/'),避免二次转义。
可使用正则匹配实现,C#示例代码如下:

// 先将流读取为字符串
using var reader = new StreamReader(stream);
string xmlContent = reader.ReadToEnd();
// 替换未转义的&,仅匹配不属于合法XML实体外的独立&
xmlContent = System.Text.RegularExpressions.Regex.Replace(
    xmlContent, 
    @"&(?!(lt|gt|amp|quot|apos);)", 
    "&"
);
// 将处理后的字符串转为流再送入XML解析器
using var processedStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xmlContent));
// 后续用processedStream替换原来的stream做解析即可

方案2:调整XML解析器配置降低校验严格度

使用XmlReader代替老旧的XmlTextReader,通过配置关闭字符校验开关、放宽校验规则,解析器会跳过部分格式校验:

var settings = new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Ignore,
    CheckCharacters = false,
    ValidationType = ValidationType.None,
    ValidationFlags = System.Xml.Schema.XmlSchemaValidationFlags.None
};
using (var xr = XmlReader.Create(stream, settings))
{
    xr.Namespaces = (NamespaceManager != null);
    while (xr.Read())
    {
        if (xr.NodeType == XmlNodeType.Element && arrTag.Contains(xr.Name))
        {
            var node = (XElement)XNode.ReadFrom(xr);
            yield return node;
        }
    }
}

注意:该方案仅对部分轻度格式问题生效,如果XML格式错误较多时依然会继续报错。

方案3:使用高容错解析库

如果前两种方案都无法满足需求,可以使用HtmlAgilityPack这类专为非规范标记语言设计的解析库,这类库默认对格式错误的容忍度极高,不需要提前预处理即可直接解析包含未转义特殊字符的XML内容,解析完成后可直接转换为XElement结构使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:06:03