处理损坏XML需预处理与容错:先清理BOM、修复标签和非法字符,再用XmlReader配置宽容模式解析;若仍失败,可用HtmlAgilityPack转义或分段提取关键数据,结合规则库逐步还原。
当C#程序遇到损坏的XML文件时,直接使用XDocument或XmlDocument会抛出异常。标准解析器对格式要求严格,但实际项目中常需处理不规范数据。解决这类问题不能只依赖默认行为,需要结合容错策略和文本预处理。
许多“损坏”并非完全不可读,而是缺少闭合标签、引号不匹配或非法字符。可在加载前尝试清理内容:
应为
)string raw = File.ReadAllText("broken.xml", Encoding.UTF8);
// 移除BOM和首部空白
raw = raw.TrimStart();
if (raw.StartsWith("")) raw = raw.Substring(1); // 清理UTF-8 BOM
// 简单修复自闭合标签(仅作示意,复杂场景需更智能)
raw = Regex.Replace(raw, @"<([^/?][^ ]+) ([^>]+) ?/>", "<$1 $2 />");
raw = Regex.Replace(raw, @"<([^/?][^>]+)>(?!<)", "<$1>$1>"); // 极简补全,风险高,需上下文判断
// 替换非法XML字符
raw
= Regex.Replace(raw, @"[\x00-\x08\x0B\x0C\x0E-\x1F]", "");
XDocument doc;
try {
doc = XDocument.Parse(raw);
} catch (XmlException ex) {
// 继续尝试其他方法
}
XmlReader本身仍严格校验,但它可配合预处理器使用。重点是不要直接传字符串给XDocument.Parse,而是通过流式方式控制输入。
XmlReaderSettings中的DtdProcessing为Parse或Ignore,防止外部DTD引发问题IgnoreWhitespace和IgnoreComments减少干扰XmlReader.ReadInnerXml()读节点片段)var settings = new XmlReaderSettings {
DtdProcessing = DtdProcessing.Ignore,
IgnoreWhitespace = true,
IgnoreComments = true,
CheckCharacters = false // 可选:容忍部分非法字符
};
using var reader = XmlReader.Create(new StringReader("- content
"), settings);
reader.Read();
if (reader.NodeType == XmlNodeType.Element) {
var fragment = XDocument.Parse($"{reader.ReadInnerXml()} ");
}
如果XML接近HTML风格(标签嵌套混乱、大小写混用、属性无引号),可尝试用HTML解析库先转换。
HtmlAgilityPack加载非标准标记文本XDocument处理var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(File.ReadAllText("broken.xml")); // 即使是XML也能勉强解析
// 导出为XML格式字符串
using var sw = new StringWriter();
htmlDoc.Save(sw);
string cleaned = sw.ToString();
// 再尝试用XML解析器加载
XDocument doc = XDocument.Parse(cleaned);
若整体修复困难,可退而求其次:不追求完整文档,只提取可用部分。
这种策略适合日志型XML或消息流,其中每个块相对独立。
基本上就这些。核心思路是:不要指望一次加载成功,而是把“修复”看作清洗流程——先降级处理,再逐步还原。关键是根据数据来源判断损坏类型,针对性地预处理。对于频繁出现的特定错误,可以积累规则库自动修补。虽然.NET原生API不支持松散解析,但结合文本操作和第三方库,仍能有效抢救多数半坏XML。不复杂但容易忽略的是编码和BOM问题,往往比标签错误更早导致失败。
# html
# node
# 处理器
# 编码
# 字节
# xml解析
# c#
# .net
# xml
# 字符串
# 预处理器
# bom
# ASCII
# 加载
# 移除
# 的是
# 退而求其次
# 也能
# 将其
# 这类
# 可在
# 即使是
# 不支持
相关文章:
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
建设网站制作价格,怎样建立自己的公司网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何在香港服务器上快速搭建免备案网站?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
网页设计与网站制作内容,怎样注册网站?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何在万网ECS上快速搭建专属网站?
建站之星收费标准详解:套餐费用及年费价格表一览
建站之星后台管理如何实现高效配置?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何快速搭建虚拟主机网站?新手必看指南
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
焦点电影公司作品,电影焦点结局是什么?
建站之星价格显示格式升级,你的预算足够吗?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何配置IIS站点权限与局域网访问?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何通过VPS建站无需域名直接访问?
建站之星与建站宝盒如何选择最佳方案?
宝塔面板如何快速创建新站点?
C#怎么使用委托和事件 C# delegate与event编程方法
建站之星代理如何获取技术支持?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
西安专业网站制作公司有哪些,陕西省建行官方网站?
建站之星如何防范黑客攻击与数据泄露?
如何选择高效稳定的ISP建站解决方案?
,柠檬视频怎样兑换vip?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
建站VPS推荐:2025年高性能服务器配置指南
视频网站app制作软件,有什么好的视频聊天网站或者软件?
TestNG的testng.xml配置文件怎么写
制作网站的模板软件,网站怎么建设?
网页设计网站制作软件,microsoft office哪个可以创建网页?
金*站制作公司有哪些,金华教育集团官网?
太原网站制作公司有哪些,网约车营运证查询官网?
建站之星代理平台如何选择最佳方案?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
英语简历制作免费网站推荐,如何将简历翻译成英文?
已有域名和空间,如何快速搭建网站?
建站主机选购指南:核心配置优化与品牌推荐方案
如何快速搭建FTP站点实现文件共享?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何通过主机屋免费建站教程十分钟搭建网站?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何挑选优质建站一级代理提升网站排名?
开心动漫网站制作软件下载,十分开心动画为何停播?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
*请认真填写需求信息,我们会在24小时内与您取得联系。