我正在尝试构建一些类,以便我可以反序列化由第三方应用程序创建的XML文件。幸运的是,第三方应用程序的开发人员在其代码中包含了一个模式文件,以便可以理解XML文件。
当我使用Visual Studio中的XSD.exe工具时,该过程无法报告以下错误
来自targetNamespace =''的'Group'SegGroupOrSegmentGrouping'具有无效定义:循环组引用。“
任何有关如何根据此错误生成类文件的帮助将不胜感激。 可以在此处找到模式文件的副本:schema file
答案 0 :(得分:12)
我最近遇到了同样的问题,
我从第三方公司获得了一个Schema,它从Web服务返回一个xml结构。然后,我想反复排序响应,并使用NHibernate将信息存储到数据库中。
没问题我以为我只会使用xsd.exe而且我会上课。不幸的是,这不是。 Xsd.exe失败,出现了完全相同的错误。这是因为它无法解析循环引用。
我花了几天时间查看替代方案,直到最后我将自己的类结构编写到模式中并且能够完美地反序列化。这里的答案是编写自己的C#类并使用适当的属性装饰它们。
节省一些时间和心痛,不要继续尝试最终自动生成所需的类,尽管耗费你所编写的课程耗费大量工具(不能完美运行)的妥协会让你成功。
我花了大约3天的时间来编写课程结构(它很大)但我最终得到了一个高质量的解决方案。
有一点可以肯定你将无法使用xsd.exe以及我在google搜索后尝试的大多数其他工具要么无法正常工作,要么是有错误的。
答案 1 :(得分:10)
尝试使用svcutil
;它可以处理循环引用。
在以下示例中,eExact-Schema.xsd
是xsd.exe
无法处理的XSD。
示例:
C:\SRC\Exact>svcutil eExact-Schema.xsd /language:C# /dataContractOnly /importxmltypes /out:exact.cs
这始终是一个好的开始;您现在可以使用此类并根据您的风格/需求进行更改,添加注释等,这将为您节省大量时间/搜索从头开始。
答案 2 :(得分:3)
在尝试了几个第三方工具后,我发现Liquid Technologies有一个非常强大的生成器Liquid XML Data Binder 2012。它能够处理我面临的循环组参考问题。它可以从2.0开始为几乎任何版本的.net生成代码。它生成的类确实依赖于它们提供的可再发行的dll。我正在使用试用版,如果在发布之前购买完整版本,我不会感到惊讶。但是,为了救了我大概一百个小时或者更容易出错的手工编码,我不能抱怨。
答案 3 :(得分:0)
对我来说最简单的方法是使用XSD.EXE从实际的XML文件创建XSD文件。然后从新的XSD文件创建一个类。如果引入了原始XML中不存在的节点或类型,则可能需要定期修改该类,但您将节省编码时间的小时!!!!