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
相关产品推荐
相关产品推荐

