XSD.exe 和“循环组引用”

Posted

技术标签:

【中文标题】XSD.exe 和“循环组引用”【英文标题】:XSD.exe and "Circular Group references" 【发布时间】:2011-01-24 05:38:32 【问题描述】:

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

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

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

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

【问题讨论】:

经过进一步研究,XSD.exe 工具似乎存在许多问题。我正在使用第三方工具的代码生成工具取得进展,该工具从模式生成 C# 代码没有任何问题(并且还生成了更好的类文件)。 你用了什么第三方工具,因为我也有同样的问题? BENBUN,能否介绍一下这个工具? Yurik - 我不记得我们现在使用的工具了。碰巧的是,我们使用该工具生成的代码遇到了其他问题。最后我自己写了自己的代码,效果很好。 【参考方案1】:

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

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

例子:

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

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

【讨论】:

疯了。这从 OpenCollada 规范中创建了一大堆类,而 XSD 立即失败了。不错! 更疯狂的是,这个解决方案实际上与我遇到问题的 xsd 完全相同。 精确到胜利@Volkirith :) 它实际上并没有创建一个真正的 C# 模型,其中字段由纯 c# 属性表示。相反,它使用应该存储属性的XmlNode 数组创建类。【参考方案2】:

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

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

没问题,我想我会使用 xsd.exe 来上课。不幸的是,事实并非如此。 Xsd.exe 失败,与您遇到的错误完全相同。这是因为它无法解析循环引用。

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

为自己节省一些时间和心痛,不要继续尝试最终自动生成您需要的类,尽管耗时您编写的类不会做出大多数工具(不能完美运行)的妥协会让你成功的。

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

有一点是肯定的,你将无法使用 xsd.exe 和我在谷歌搜索后尝试的大多数其他工具,要么不能正常工作,要么有错误。

【讨论】:

Krystan - 我必须同意,这也是我的发现。我最终手工编写了课程。 我刚刚遇到了同样的问题,但没有手动编码,只需在修改后的 xsd 文件上增量执行 xsd.exe 即可解决。 devio.wordpress.com/2012/05/22/… 增量方法会起作用,但如果您需要以自动方式生成并且如果您不是所有者,那么修改 xsds 是完全不行的。只是我的 0.02 美元 +1 用于手动编写类。这些工具可以很好地作为简单示例的概念证明。在现实生活中的复杂模式中,他们每次都让我失望......【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于XSD.exe 和“循环组引用”的主要内容,如果未能解决你的问题,请参考以下文章

XSD.exe 并创建对父元素的引用。

引用通用类型的 XSD Gen 类

使用 xsd.exe 或 svcutil.exe 对 UWP 和 Xamarin 进行 C# XML 序列化

使用 XSD.exe 的多个版本 C# 类/XSD

多个 xsd 文件的 xsd.exe 类生成器问题

xsd.exe 生成正确的类型