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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:30:01