XSD转C#类根元素不匹配导致XML反序列化报错的修复咨询
根节点不匹配反序列化报错修复方案
问题本质:xsd2code++仅基于Hexagon扩展Schema生成代码时,会将扩展节点HexagonLandXML识别为XML根节点,但实际业务XML的根节点是属于http://www.landxml.org/schema/LandXML-1.2命名空间的LandXML,HexagonLandXML只是根节点下带独立命名空间的子节点,根节点命名空间和元素名不匹配就会触发反序列化异常。
方案1:无需修改自动生成代码,手动补充根类(最简便,首推)
完全不需要改动xsd2code++已经生成的所有Hexagon相关实体类,仅需手动补充一个根实体类即可,步骤如下:
- 新建
LandXML.cs类文件,定义根节点实体,标注正确的XML序列化特性:
[Serializable] [XmlRoot(ElementName = "LandXML", Namespace = "http://www.landxml.org/schema/LandXML-1.2", IsNullable = false)] public partial class LandXML { // 按需添加你需要解析的原生LandXML节点,比如Units、Application public Units Units { get; set; } public Application Application { get; set; } // 关联已生成的HexagonLandXML类型,指定对应子节点的命名空间 [XmlElement(ElementName = "HexagonLandXML", Namespace = "http://xml.hexagon.com/schema/HeXML-1.9")] public HexagonLandXML HexagonLandXMLData { get; set; } }
- 反序列化时直接将目标类型指定为新建的
LandXML类即可,原有自动生成的Hexagon相关类的特性配置完全正确,不需要做任何调整。
提示:如果不需要解析
HexagonLandXML之外的其他LandXML节点,可以不用定义Units、Application这些属性,XmlSerializer默认会自动跳过未在实体类中定义的节点,不会抛出异常。
方案2:调整生成配置,从根源生成正确代码(适合需要反复生成代码的场景)
如果后续会频繁更新XSD、需要反复重新生成实体类,可以直接调整xsd2code++的生成规则,避免每次手动补类:
- 不要单独加载Hexagon扩展XSD执行生成,先将官方LandXML 1.2主Schema文件和Hexagon扩展Schema文件放到同一本地目录
- 在xsd2code++中加载LandXML主Schema作为生成源,工具会自动识别主Schema中import的Hexagon扩展Schema
- 生成配置中的「根元素选择」项手动指定为
LandXML,不要选工具默认识别到的HexagonLandXML,执行生成后工具会自动输出包含正确根节点、子节点命名空间映射的完整实体类,无需手动修改任何代码。
避坑提醒
不要直接修改自动生成的HexagonLandXML类上的XmlRootAttribute,比如强行把元素名改成LandXML、命名空间改成LandXML的地址:这种操作会破坏HexagonLandXML作为子节点的命名空间配置,后续解析Hexagon节点内部数据时会出现新的命名空间匹配错误,而且每次重新生成自动代码都会覆盖你的手动修改,维护成本极高。
内容的提问来源于stack exchange,提问作者SteveJ71
相关产品推荐
相关产品推荐

