C#如何在不抛出异常的情况下将格式错误的XML解析为XmlDocument
.NET 官方自带的 XmlDocument 类没有内置 TryLoadXml 方法,你可以通过扩展方法自行封装该能力,内部通过捕获解析异常实现失败回退,是目前最简洁优雅的实现方案。
扩展方法实现
using System.Xml; public static class XmlDocumentExtensions { /// <summary> /// 尝试从字符串加载XML内容到XmlDocument /// </summary> /// <param name="xmlDoc">目标XmlDocument实例</param> /// <param name="xmlContent">待解析的XML字符串</param> /// <returns>解析成功返回true,失败返回false</returns> public static bool TryLoadXml(this XmlDocument xmlDoc, string xmlContent) { if (xmlDoc == null) throw new ArgumentNullException(nameof(xmlDoc)); if (string.IsNullOrWhiteSpace(xmlContent)) return false; try { xmlDoc.LoadXml(xmlContent); return true; } catch (XmlException) { // XML格式错误直接返回失败 return false; } catch (ArgumentException) { // 输入参数非法返回失败 return false; } } // 可选:直接从流加载的重载,适配HTTP请求体场景,避免额外的字符串转换开销 /// <summary> /// 尝试从流加载XML内容到XmlDocument /// </summary> /// <param name="xmlDoc">目标XmlDocument实例</param> /// <param name="stream">待解析的XML流</param> /// <returns>解析成功返回true,失败返回false</returns> public static bool TryLoad(this XmlDocument xmlDoc, Stream stream) { if (xmlDoc == null) throw new ArgumentNullException(nameof(xmlDoc)); if (stream == null || !stream.CanRead) return false; try { xmlDoc.Load(stream); return true; } catch (XmlException) { return false; } catch (IOException) { // 流读取错误返回失败 return false; } } }
使用示例
完全匹配你期望的调用方式:
var requestXmlBody = new XmlDocument(); if (requestXmlBody.TryLoadXml("<test<test/>")) { // 解析成功后执行的业务逻辑 }
处理HTTP请求体时可以用流重载,性能更优:
var requestXmlBody = new XmlDocument(); // 重置请求体位置,避免之前的读取操作导致流位置不在开头 Request.Body.Position = 0; if (requestXmlBody.TryLoad(Request.Body)) { // 解析成功逻辑 }
可选:带错误信息返回的重载
如果需要获取解析失败的具体原因做日志排查,可以使用带out参数的版本:
public static bool TryLoadXml(this XmlDocument xmlDoc, string xmlContent, out Exception parseError) { parseError = null; if (xmlDoc == null) { parseError = new ArgumentNullException(nameof(xmlDoc)); return false; } if (string.IsNullOrWhiteSpace(xmlContent)) { parseError = new ArgumentException("XML内容不能为空", nameof(xmlContent)); return false; } try { xmlDoc.LoadXml(xmlContent); return true; } catch (Exception ex) { parseError = ex; return false; } }
调用方式:
var requestXmlBody = new XmlDocument(); if (requestXmlBody.TryLoadXml("<test<test/>", out var error)) { // 解析成功逻辑 } else { // 可以打印error.Message记录错误原因 Console.WriteLine($"XML解析失败:{error.Message}"); }
内容的提问来源于stack exchange,提问作者Redline
相关产品推荐
相关产品推荐

