天道酬勤,学无止境

XSD.exe and "Circular Group references"

I am attempting to build some classes so that I can deserialise an XML file created by a third party application. Luckily the developer of the 3rd party application included a schema file with their code so that the XML file can be understood.

When I use the XSD.exe tool from Visual Studio the process fails reporting the following error

"Group 'SegGroupOrSegmentGrouping' from targetNamespace='' has invalid definition: Circular group reference."

Any help in how I can generate the class files in light of this error would be appreciated. A copy of the schema file can be found here : schema file

评论

Try using svcutil; it can handle the circular references.

In the following example, eExact-Schema.xsd is an XSD that xsd.exe cannot handle.

Example:

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

This is always a good place to start; you can now use this class and alter to suit your style/needs, add comments, etc, and it will save you a lot of time/searching over doing it all from scratch.

I had this same problem recently,

I was given a Schema from a third party company who were returning an xml structure from a webservice. I then wanted to deserialise the response and store the information into a database with NHibernate.

No problem I thought I'll just use xsd.exe and I'll have my classes. Unfortunately this was not to be. Xsd.exe failed with exactly the same error you are getting. This is because it is unable to resolve circular references.

I spent a good few days looking at alternatives until in the end I wrote my own class structure to the schema and was able to deserialise perfectly. The answer here is to write your own C# classes and decorate them with the appropriate attributes.

Save yourself some time and heartache and don't continue to try and generate the classes you need automatically in the end although time consuming the classes you write won't make the compromises that most tools (which don't work perfectly) will make you make.

Took me about 3 days to write the class structure (it was large) but I ended up with a quality solution.

One thing is certain you will not be able to use xsd.exe and most other tools I tried after googling this either did not work properly or were buggy.

After trying several third party tools, I found that Liquid Technologies has a very robust generator called Liquid XML Data Binder 2012. It was able to handle the circular group reference problem I faced. It can generate code for just about any version of .net from 2.0 on. The classes it generates do depend on a redistributable dll that they provide. I'm using the trial version and I wouldn't be surprised if a purchase of the full version will be necessary before I go to release. However, having saved me probably a hundred hours or more of error prone hand coding, I can't complain.

The easiest method for me is to create the XSD file from the actual XML file with XSD.EXE. Then create a class from the new XSD file. You may be required to modify the class periodically if nodes or types are introduced that did not exist in the original XML but you will save yourself HOURS of coding time!!!!

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Is svcutil.exe a replacement for xsd.exe?
    I am using xsd.exe to generate some c# classes from a .xsd file. I ran into the same issue that is covered here and on other sites where xsd.exe generates Type[] arrays instead of generic List collections for types in the .xsd file. Some people have suggested that svcutil.exe can be used as a replacement for xsd.exe if you pass the /dataContractOnly parameter to svcutil.exe. However, it seems like those people are mistaken because svcutil.exe actually generates System.Xml.XmlNode[] array properties instead of creating types based on the schema in the .xsd file. For example, given this simple
  • 为什么XSD.EXE创建两个.XSD文件,以及如何使用它们?(Why does XSD.EXE Create Two .XSD Files, and How to Use Them?)
    问题 我正在使用以下命令从输入的XML文件-response.xml生成相关的xsd文件,我的困惑是(1)为什么有两个xsd文件输出(response.xsd和response_app1.xsd),我认为应该有其中只有一个产生了? (2)如果需要使用xsd / classes生成C#类文件,应该使用哪个xsd文件? 我的环境:VSTS 2008 + C#+ .Net 3.5。 D:\>xsd response.xml Microsoft (R) Xml Schemas/DataTypes support utility [Microsoft (R) .NET Framework, Version 2.0.50727.3038] Copyright (C) Microsoft Corporation. All rights reserved. Writing file 'D:\response.xsd'. 这是我的输入XML文件和输出XSD文件, http://www.mediafire.com/file/kzzoxw0zwgq/inputoutput.zip 编辑1: 当我执行xsd response.xsd生成相关的C#类时,出现错误消息,下面是详细的输出, D:\>xsd response.xsd /classes Microsoft (R) Xml Schemas
  • XSD.exe 不强制 minOccurs(XSD.exe doesn't enforce minOccurs)
    问题 我有一个简单的架构,我将 minOccurs 和 maxOccurs 声明为 1。当我运行 XSD.exe 以生成 C# 类并在代码中使用该类时; 该字段不是强制执行的。 是否缺少一些额外的步骤? 还是使用 XSD.exe 生成的类不是必填字段? 任何建议或见解都会有所帮助。 回答1 就像 Visual Studio 中的 Xml/infer 模式工具一样,每当我使用 XSD.exe 时,我最终都会修复一些生成的代码。 XSD.exe 做了一个很好的近似,但它并不完全有效。 minOccurs / maxOccurs 'bug' 记录在 MSDN 上。 从 XML 架构文档生成源代码时,Xsd.exe 会忽略应用于 <choice>、<sequence>、<group>、<all> 和 <any> 元素的 minOccurs 属性。 对于元素,如果 maxOccurs 属性的值大于 1 或无界,Xsd.exe 将忽略 minOccurs 属性。 在这种情况下,该工具会生成与 XSD 数据类型对应的类型的数组。 Xsd.exe 使用 maxOccurs 属性的值来确定是生成单个实例还是数组。 对于元素,如果 minOccurs 属性应用于转换为 .NET Framework 引用类型的架构数据类型,则 Xsd.exe 也会忽略该属性。 只有当以下所有条件都为真时,Xsd.exe
  • XSDObjectGen.exe和XSD.exe(XSDObjectGen.exe vs XSD.exe)
    问题 谁能告诉我XSDObjectGen.exe和XSD.exe有什么区别? 有什么方法可以使XSDObjectGen.exe在点网2.0中工作? 回答1 另外,还有Xsd2Code。 一些功能: 生成局部类。 支持通用和自定义集合(List,ObservableCollection,MyCustomCollection)。 当不需要特殊的获取或设置时,支持自动属性。 可以生成WCF属性(DataContract / DataMember)。 支持可修剪类型。 屏蔽IDE中的私有字段(使用EditorBrowsableState.Never属性)。 在构造函数中生成对象分配。 实现INotifyPropertyChanged以启用wpf或Silverlight的数据绑定。 通过Visual Studio外接程序提高生产力。 从xsd批注生成摘要文档。 在引发属性更改事件之前,请检查新值和旧值int setter是否相同。 在cs或vb标头中生成备份选项。 将Xml文档保存并加载到Silverlight应用程序的隔离文件存储中(3.0中的新增功能)。 生成CS,VB或CPP代码。 序列化/反序列化对象。 保存到文件并从文件加载。 包括Xsd2CodeCustomTool。 回答2 区别在于: XML架构定义工具( xsd.exe )是Visual Studio SDK的一部分
  • svcutil.exe 是 xsd.exe 的替代品吗?(Is svcutil.exe a replacement for xsd.exe?)
    问题 我正在使用 xsd.exe 从 .xsd 文件生成一些 c# 类。 我遇到了相同的问题,这里和其他站点上都提到了 xsd.exe 生成 Type[] 数组而不是 .xsd 文件中类型的泛型 List 集合。 有人建议,如果您将 /dataContractOnly 参数传递给 svcutil.exe,则 svcutil.exe 可以用作 xsd.exe 的替代品。 但是,这些人似乎错了,因为 svcutil.exe 实际上生成 System.Xml.XmlNode[] 数组属性,而不是根据 .xsd 文件中的架构创建类型。 例如,给定这个简单的 .xsd 架构: <?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:mstns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:complexType name="Employee"> <xs:all> <xs
  • 在Windows 8的Visual Studio 2013中的哪里可以找到xsd.exe(where to find xsd.exe in visual studio 2013 on windows 8)
    问题 我已使用Visual Studio 2003和2008的xsd.exe实用程序从第三方XSD文件生成类型化的数据集。 第三方已更改其架构,因此我需要重新生成数据集,但找不到XSD.EXE 。 win8搜索为我提供了有关实用程序的信息,但没有提供实用程序的位置,我在Windows资源管理器中尝试了搜索,但未获得任何结果。 我读了有关Win7/VS 2008帖子,说它是WinSDK的一部分,但我也不能在该文件夹中找到它。 一些发布者说,现在需要从哪里下载它。 我正在运行64 bit Windows 8 pro和Visual Studio 2013 Ultimate 。 回答1 安装SDK *(手动或与Visual Studio一起安装)后,您将在以下目录中找到它: SDK 8及更高版本 还有一个附加的FX版本子目录: %programfiles(x86)%\Microsoft SDKs\Windows\{ver}\bin\{FXVer} Tools 在哪里 {ver}是SDK版本(例如v8.1A ) 而{FXVer}是适用的.Net Framework版本,例如NETFX 4.0v 例如 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools C:\Program Files (x86)
  • 从已知的 XSD 生成 .Net 对象(Generate .Net objects from known XSD)
    问题 我有一些 XSD-s 来定义我的对象层次结构。 例如 math.xsd, base.xsd 而 math.xsd 依赖于 base.xsd。 我需要从那些 xsd-s 生成类。 我已经阅读了这两个工具:CodeXS 工具和 XSD.exe。 xsd.exe 的问题是我没有成功地从两个相互依赖的 xsd-s 生成类。 有没有人知道在这种情况下使用 xsd.exe 的正确参数? 此外,我正在寻找: - 更多工具 - 这些工具之间的比较 - 使用 .net 3.5 的 xsd 对象 谢谢。 回答1 您没有理由不能使用xsd.exe使用的相同方法,但随后针对生成的 CodeDOM 模型运行您自己的代码以在将 .cs 文件写入磁盘之前进行所需的修改。 一般的想法是将 XSD 文件加载到XmlSchema对象中,然后使用内部XmlCodeExporter和XmlSchemaImporter类来填充 CodeDOM 命名空间。 完成此操作后,您可以自由地对 CodeDOM AST 进行任何需要进行的调整,然后将其写入磁盘。 例如。 XmlSchema schema = null; // Load XSD file here var schemas = new XmlSchemas(); schemas.Add(schema); var ns = new CodeNamespace {
  • 我在Visual Studio 2008中找不到xsd.exe吗?(I can't find xsd.exe in Visual Studio 2008?)
    问题 在Visual Studio 2005中,XSD编译器位于SDK / v2.0目录中。 在Visual Studio中,只有一个SDK / v3.5目录消失了,因此xsd.exe编译器也消失了。 它去哪了? 回答1 我对上述答案不完全满意,我发现包含XSD.exe编译器的SDK现在作为Windows SDK的一部分分发了。 请参阅http://msdn.microsoft.com/en-gb/windows/bb980924.aspx?wt.svl=more_downloads 它作为Visual Studio 2008程序包的一部分分发,但他们已将其从Visual Studio目录树移至: 在32位Windows“程序文件/ Microsoft SDK”和64位Windows“程序文件(x86)/ Microsoft SDK”上 回答2 我在这里有xsd.exe C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\xsd.exe C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\xsd.exe 我已经安装了VS2005和VS2008(并且在安装之前已安装VS2003)。 回答3 我在这里有xsd.exe:C:\ Program Files \ Microsoft
  • 如何使用 xsd.exe 工具从 .cs 生成 .xsd?(How to generate .xsd from a .cs using xsd.exe tool?)
    问题 我有一个 .cs 文件,其中包含 XTypedElement 和 IXMetaData 的子类。 Microsoft 有一个工具可以从托管代码自动生成 XSD 文件,但它不接受 .cs 文件。 它只接受 .exe、.dll、.xdr、.xml 和 .xsd。 如何使用此工具将我的 .cs 文件转换为 .xsd 文件? 回答1 首先需要将其编译成dll或exe文件,即.NET程序集,然后将其作为xsd.exe的输入 如果只想转换特定类,请使用以下命令: xsd bin\Release\MyAssembly.exe /type:The.FullName.Of.YourType
  • 从XSD生成DataContract(Generate DataContract from XSD)
    问题 我希望能够从XSD文件生成DataContract ,最好使用xsd.exe工具。 自动在每个项目上生成[DataContract]和[DataMember]的最简单方法是什么? 还是有更好的方法? 我试图避免每次更改和重新生成XSD文件时都必须重新创建数据协定。 回答1 xsd.exe工具早于WCF,并且对[DataContract]和[DataMember]一无所知。 如果确实使用xsd.exe ,则必须切换WCF以使用XmlSerializer而不是其默认的DataContractSerializer来序列化数据协定。 xsd.exe的WCF等效xsd.exe是svcutil.exe-它具有一个/dconly参数,该参数仅根据给定的XSD文件创建数据协定。 这将为您生成一个C#或VB.NET文件,其中包含注释清楚的数据协定。 用法: svcutil.exe (name of your XSD).xsd /dconly 这将在您的目录中生成一个具有相同基本名称的* .cs文件。 以我的经验, svcutil.exe对其XML结构非常挑剔-因此,如果它因大量的警告和/或错误而向您咆哮,请不要感到惊讶。 回答2 使用svcutil.exe而不是xsd.exe 如何使用 ? 转到“开始”菜单-> Microsoft Visual Studio 2008-> Visual
  • 我们可以在xsd.exe工具生成的类中控制类型名称吗(Can we control type name in xsd.exe tool generated class)
    问题 xsd.exe工具为给定的xsd文件生成类。 它遵循一种用于命名类型的模式。 例如, <Students> <Student Name="A" RollNo="1" Address="Some Address"> <Department Id="20" Name="CSE"/> </Student> </Students> xsd.exe /c Students.xsd Students.cs文件生成。 如果我们看到元素的类型 Element Type Name Students Students Student StudentsStudent Department StudentsStudentDepartment 如果元素是子元素,它将通过在父元素名称前添加前缀来生成类型。 我们可以控制这个名字吗? 我需要与元素名称相同的类型名称。 学生=>学生,系=>系 提前致谢 回答1 通常,使用xsd.exe时无法自定义生成的类的名称-与其他地方可用的机制不同,例如,通过自定义JAXB绑定文件的JAXB用户。 但是,对于xsd.exe,生成的类名称取决于创作样式。 当创作风格符合“俄罗斯娃娃”时,即会生成您所描述的内容,如下所示: <?xml version="1.0" encoding="utf-8"?> <!--XML Schema generated by
  • 在C#项目中使用XSD Build任务(Use XSD Build task in c# project)
    问题 如何在ac#项目中使用c ++ XSD任务? 我已经在csproj文件中创建了任务,如下所示: <Target Name="BeforeBuild"> <XSD Namespace="$(RootNamespace).Xml" Language="CS" GenerateFromSchema="classes" Sources="Xml/schema.xsd" /> </Target> 但是构建输出显示,尽管intellisense在编辑项目文件时为我提供了XSD任务: Error 1 The "XSD" task was not found. Check the following: 1.) The name of the task in the project file is the same as the name of the task class. 2.) The task class is "public" and implements the Microsoft.Build.Framework.ITask interface. 3.) The task is correctly declared with <UsingTask> in the project file, or in the *.tasks files located in the "C
  • Generating an XSD file with xsd.exe tool from an XML file with multiple namespaces
    What I want to do: I am trying to generate an XSD file for an existing XML file. I'm using the xsd.exe tool (shipped with Visual Studio). Some of the elements in the XML file are namespace-qualified. In some cases local names are the same, just as below: <images> <icons> <icon url="http://www.icons.com/logo.png"/> </icons> <foo:icons> <foo:foo_icon url="http://www.foo.org/pic.ico"/> </foo:icons> </images> What I am getting: Calling xsd.exe myfile.xml gives me an error: Cannot add a column named 'icons': a nested table with the same name already belongs to this DataTable. OK but that's what the
  • 如何使用 XSD.exe 从 C# 类型生成 XML 架构,以便将 [XmlAttribute] 属性映射到所需的 XML 属性?(How to generate XML Schema from C# type with XSD.exe such that [XmlAttribute] property is mapped to required XML attribute?)
    问题 简而言之,当我使用 XSD.exe(Visual Studio 2012 附带的)从此类生成 XML 架构文件时: [Serializable] public class Person { [XmlAttribute] public string Name { get; set; } [XmlAttribute] public int Age { get; set; } } 我得到这个结果: <?xml version="1.0" encoding="utf-8"?> <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Person" nillable="true" type="Person" /> <xs:complexType name="Person"> <xs:attribute name="Name" type="xs:string" /> <xs:attribute name="Age" type="xs:int" use="required" /> </xs:complexType> </xs:schema> 请注意, Age属性在生成的模式中被指定为 required (它有use="required"
  • 如何从一个类创建一个XSD模式?(How to create a XSD schema from a class?)
    问题 我在使用XSD文件时遇到了麻烦。 我正在尝试从一个类创建一个XSD文件: public enum Levels { Easy, Medium, Hard } public sealed class Configuration { public string Name { get;set; } public Levels Level { get; set; } public ConfigurationSpec { get;set;} } public abstract class ConfigurationSpec { } public class ConfigurationSpec1 { // ... } public class ConfigurationSpec2 { // ... } 请注意,我在Configuration中有一个抽象类。 有了该功能,是否可以创建XSD?如果可以,如何创建XSD? 想法是将类Configuration传递给XSD。 回答1 您可以使用XSD.exe (可从Visual Studio安装中获得。) public sealed class Configuration { public string Name { get; set; } public Levels Level { get; set; } public
  • 通过 .NET Framework 类以编程方式使用 XSD.exe 工具功能(从 XSD 架构生成类)?(Programmatically use XSD.exe tool feature (generate class from XSD Schema) through .NET Framework classes?)
    问题 我想从 XML XSD Schema 生成一个类,就像使用 Xsd.exe 工具一样。 例如XSD.exe /namespace:Generated.Xsd_1 /classes /outputdir:..\Classes 有没有办法通过使用 .NET Framework 中的类而不是使用独立工具来做到这一点? 回答1 无耻地从这里借来的: using System; using System.IO; using System.Collections.Generic; using System.Reflection; using System.Text; using System.Xml; using System.Xml.Serialization; using System.Xml.Schema; using System.CodeDom; using System.CodeDom.Compiler; using Microsoft.CSharp; using NUnit.Framework; namespace XmlSchemaImporterTest { [TestFixture] public class XsdToClassTests { // Test for XmlSchemaImporter [Test] public void
  • Can't find xsd.exe in the path during MSBuild Community Tasks BeforeBuild step in Visual Studio
    I am using MSBuild Community Tasks to run Xsd.exe as part of my build in Visual Studio as thus: <Import Project="$(SolutionDir)Common.targets" /> <PropertyGroup> <MSBuildCommunityTasksPath>$(SolutionDir)TeamBuildTypes</MSBuildCommunityTasksPath> </PropertyGroup> <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> <UsingTask TaskName="XSD" AssemblyFile="$(VCTargetsPath)$(CPPTasks)" /> <Target Name="BeforeBuild"> <!--Exec Command="'$(DevEnvDir)..\Tools\vsvars32.bat'" /--> <XSD Sources="MySchema.xsd" GenerateFromSchema="classes" Language="CS" /> </Target> Common
  • Why does XSD.EXE Create Two .XSD Files, and How to Use Them?
    I am using the following command to generate related xsd file from my input XML file -- response.xml, my confusion is (1) why there are two xsd file output (response.xsd and response_app1.xsd), I think there should be only one of them generated? (2) If I need to generate C# class file by using xsd /classes, which xsd file should I use? My environment: VSTS 2008 + C# + .Net 3.5. D:\>xsd response.xml Microsoft (R) Xml Schemas/DataTypes support utility [Microsoft (R) .NET Framework, Version 2.0.50727.3038] Copyright (C) Microsoft Corporation. All rights reserved. Writing file 'D:\response.xsd'
  • XSD.exe ignores simple complextypes
    We have a big wcf service, and a big xsd document where we have several elements and complex types. We generate code with the xsd.exe, and use the XmlSerializerFormat on our ServiceContract for the WCF service to serialize these objects again. Now we have a problem with xsd.exe and the definitions of an array of strings. Image we have the following element defined.. <xs:element name="Configuration" type="Configuration"/> <xs:complexType name="Configuration"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Parameters" type="Parameters" /> </xs:sequence> </xs
  • XSD.exe 忽略简单的复杂类型(XSD.exe ignores simple complextypes)
    问题 我们有一个很大的 wcf 服务和一个很大的 xsd 文档,其中有几个元素和复杂的类型。 我们使用 xsd.exe 生成代码,并使用 WCF 服务的ServiceContract上的XmlSerializerFormat再次序列化这些对象。 现在我们遇到了 xsd.exe 和字符串数组定义的问题。 图像我们定义了以下元素.. <xs:element name="Configuration" type="Configuration"/> <xs:complexType name="Configuration"> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Parameters" type="Parameters" /> </xs:sequence> </xs:complexType> <xs:complexType name="Parameters"> <xs:sequence> <xs:element name="Parameter" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> 这将导致: /// <remarks/> [System.CodeDom.Compiler