XSD.exe和“循环组引用”

我正在尝试构建一些类,以便我可以反序列化由第三方应用程序创建的XML文件。 幸运的是,第三方应用程序的开发人员包含一个包含其代码的模式文件,以便可以理解XML文件。

当我使用Visual Studio中的XSD.exe工具时,该过程无法报告以下错误

“来自targetNamespace =”的组’SegGroupOrSegmentGrouping’具有无效定义:循环组引用。”

任何有关如何根据此错误生成类文件的帮助将不胜感激。 可以在此处找到模式文件的副本: 模式文件

我最近遇到了同样的问题,

我从第三方公司获得了一个Schema,它从Web服务返回一个xml结构。 然后我想反序列化响应并使用NHibernate将信息存储到数据库中。

没问题我以为我只会使用xsd.exe而且我会上课。 不幸的是,这不是。 Xsd.exe失败,出现完全相同的错误。 这是因为它无法解析循环引用。

我花了几天时间查看替代方案,直到最后我将自己的类结构写入模式,并且能够完美地进行反序列化。 这里的答案是编写自己的C#类并使用适当的属性装饰它们。

节省一些时间和心痛,不要继续尝试自动生成最终需要的类,尽管耗费你所编写的课程耗费时间不会让大多数工具(不能完美运行)的妥协会让你失望使。

我花了大约3天的时间来编写课程结构(它很大)但我最终得到了一个高质量的解决方案。

有一件事是肯定你将无法使用xsd.exe和我在谷歌搜索后尝试的大多数其他工具要么没有正常工作或有bug。

尝试使用svcutil ; 它可以处理循环引用。

在以下示例中, eExact-Schema.xsdxsd.exe无法处理的XSD。

例:

 C:\SRC\Exact>svcutil eExact-Schema.xsd /language:C# /dataContractOnly /importxmltypes /out:exact.cs 

这始终是一个好的开始; 您现在可以使用此类并根据您的风格/需求进行更改,添加注释等,这将为您节省大量时间/搜索从头开始。

在尝试了几个第三方工具后,我发现Liquid Technologies有一个非常强大的生成器,名为Liquid XML Data Binder 2012 。 它能够处理我面临的循环组参考问题。 它可以从2.0开始为几乎任何版本的.net生成代码。 它生成的类确实依赖于它们提供的可再发行的dll。 我正在使用试用版,如果在我发布之前购买完整版本,我不会感到惊讶。 但是,已经救了我大概一百个小时或者更容易出错的手动编码,我不能抱怨。

对我来说最简单的方法是使用XSD.EXE从实际的XML文件创建XSD文件。 然后从新的XSD文件创建一个类。 如果引入了原始XML中不存在的节点或类型,您可能需要定期修改该类,但您将节省自己编码时间的小时数!