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

C#含xsd/xsi命名空间的XML反序列化报错,求解决方法

C# XML反序列化忽略命名空间问题解决

问题场景

给定XML内容:

<?xml version="1.0" encoding="utf-16"?>
<Test xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Number>110658419900</Number>
<WorkorderName>2103477915XVN35S_FR_LEFTX111</WorkorderName>
<RequestDate>2022-10-13T16:53:13.2171314+02:00</RequestDate> 
<ShelfNumber>4</ShelfNumber> 
</Test>

对应的C#实体类:

public class Test
{
    public string Number { get; set; }
    public string WorkorderName { get; set; }
    public string RequestDate { get; set; }
    public string ShelfNumber { get; set; }
}

使用以下代码反序列化时报错:

try
{
    XmlSerializer serializer = new XmlSerializer(typeof(Test));
    StreamReader reader = new StreamReader(fileSystemEventArgs.FullPath);
    Test test = (Test)serializer.Deserialize(reader);
    reader.Close();
    return test;
}
catch (Exception ex)
{
    string message = ex.Message;
}

错误信息:

{"There is an error in XML document (2, 17)."}

移除XML中的xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"后可正常运行。

报错原因

XML根节点声明了xsd和xsi的命名空间前缀,XmlSerializer默认会严格匹配元素的命名空间配置,而你的Test类没有对应命名空间的特性标记,导致序列化器无法识别带命名空间声明的根节点,从而抛出解析错误。

解决方案

方法一:使用XmlTextReader忽略命名空间

通过XmlTextReader的Namespaces属性设置为false,让序列化器忽略XML中的命名空间声明,直接解析元素内容:

try
{
    XmlSerializer serializer = new XmlSerializer(typeof(Test));
    using (XmlTextReader reader = new XmlTextReader(fileSystemEventArgs.FullPath))
    {
        reader.Namespaces = false;
        Test test = (Test)serializer.Deserialize(reader);
        return test;
    }
}
catch (Exception ex)
{
    string message = ex.Message;
    // 可添加错误日志或自定义处理逻辑
    return null;
}

注意:使用using语句自动释放资源,替代手动调用Close(),避免资源泄漏。

方法二:给实体类添加命名空间特性

如果需要保留XML中的命名空间声明,可以给Test类添加XmlRoot特性(此场景下根节点未使用默认命名空间,仅声明前缀,方法一更高效):

using System.Xml.Serialization;

[XmlRoot("Test")]
public class Test
{
    public string Number { get; set; }
    public string WorkorderName { get; set; }
    public string RequestDate { get; set; }
    public string ShelfNumber { get; set; }
}

若XML根节点带有默认命名空间(如<Test xmlns="http://xxx">),则需在XmlRoot中指定Namespace属性为对应URL。

内容的提问来源于stack exchange,提问作者Kacper Sierakowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:25:36