在C#开发中,XML是一种常用的数据交换和存储格式,当使用XmlDocument、XDocument等类解析不符合规范的XML字符串或文件时,系统会抛出XmlException异常。要处理这类异常并获取详细信息,需要先了解其捕获方式和属性结构。

XmlException的基本捕获方式
XmlException属于System.Xml命名空间下的异常类型,和其他异常一样,可以通过try-catch语句块进行捕获。捕获时需要把XmlException放在catch块的前面,避免被更通用的Exception类型提前拦截。
using System;
using System.Xml;
namespace XmlExceptionDemo
{
class Program
{
static void Main(string[] args)
{
string invalidXml = "<root><child>test</root>"; // 缺少闭合标签的非法XML
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(invalidXml); // 解析非法XML,会抛出XmlException
}
catch (XmlException ex)
{
Console.WriteLine("捕获到XML解析异常");
// 后续获取详细错误信息
}
catch (Exception ex)
{
Console.WriteLine("捕获到其他异常:" + ex.Message);
}
}
}
}
获取XmlException的详细错误信息
XmlException对象提供了多个属性,可以获取解析错误的详细信息,常用的属性如下:
- Message:获取错误的描述信息,说明解析失败的原因
- LineNumber:获取错误发生的行号,从1开始计数
- LinePosition:获取错误发生在当前行的位置,从1开始计数
- SourceUri:如果是解析XML文件,获取XML文件的路径;如果是解析字符串,该属性为null
- Data:获取异常的额外数据集合,部分场景下会包含更多错误上下文
完整示例:输出详细错误信息
下面的代码演示了如何提取并打印XmlException的所有关键信息:
using System;
using System.Xml;
namespace XmlExceptionDetailDemo
{
class Program
{
static void Main(string[] args)
{
// 模拟非法XML:标签未闭合,且有多余的尖括号
string invalidXml = "<root>n<child>content</child>n<parent><sub>data</parent>";
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(invalidXml);
}
catch (XmlException ex)
{
Console.WriteLine("XML解析错误详情:");
Console.WriteLine("错误描述:" + ex.Message);
Console.WriteLine("错误行号:" + ex.LineNumber);
Console.WriteLine("错误位置:" + ex.LinePosition);
if (ex.SourceUri != null)
{
Console.WriteLine("XML源路径:" + ex.SourceUri);
}
else
{
Console.WriteLine("XML源类型:字符串解析");
}
// 输出完整的异常堆栈,方便定位调用位置
Console.WriteLine("异常堆栈:" + ex.StackTrace);
}
}
}
}
解析XML文件时的错误捕获
如果是解析本地XML文件,代码逻辑和解析字符串类似,只是使用Load方法替代LoadXml方法,此时SourceUri属性会返回文件的路径:
using System;
using System.Xml;
namespace XmlFileParseDemo
{
class Program
{
static void Main(string[] args)
{
string xmlFilePath = "test.xml"; // 假设该文件存在格式错误
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlFilePath); // 加载并解析XML文件
}
catch (XmlException ex)
{
Console.WriteLine("XML文件解析错误:");
Console.WriteLine("错误描述:" + ex.Message);
Console.WriteLine("错误行号:" + ex.LineNumber);
Console.WriteLine("错误位置:" + ex.LinePosition);
Console.WriteLine("文件路径:" + ex.SourceUri);
}
}
}
}
注意事项
在捕获XmlException时,需要注意catch块的顺序,因为XmlException继承自System.SystemException,而SystemException继承自Exception,如果把catch(Exception ex)放在catch(XmlException ex)前面,那么XmlException会被通用异常块拦截,无法获取其特有的行号、位置等信息。
另外,如果XML内容来自外部输入,建议在解析前先做基础的格式校验,再结合XmlException的捕获,可以进一步提升程序的容错能力。
C#XmlExceptionXML解析异常处理修改时间:2026-07-12 04:42:10