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
相关产品推荐
相关产品推荐

