天道酬勤,学无止境

Generate Nested Types instead of Global Types with xsd.exe

Using xsd.exe in a C# class, is there a way to produce a xsd file with Nested Type, instead of Global Types?

I want to use this xsd file, with SSIS - Sql Server Integration Services, and look SSIS is not reading my xsd very well.

I want to generate the xsd like this, with Nested Types :

  <?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:element name="Country">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="City">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="CityName" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="CoutryName" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

but xsd.exe produce this , with Global Types, and SSIS don't read it. I need to change this xsd manually to be like above.

 <?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:element name="Country">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="City" type="City">
        </xs:element>
        <xs:element name="CoutryName" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="City">
    <xs:sequence>
      <xs:element name="CityName" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Any suggestion? Or other tool that I can use.

Thanks a lot.

标签

评论

I'll further assume that not "very well" means you're not seeing CountryName in your XML Source output. The documentation on MSDN is a good reading, although in my opinion it fails to describe why you would encounter the behavior you see.

I believe that it has to do with the way XML Source outputs are being determined. SSIS infers a data set from the XML structure; the top level entity, that corresponds to the root element, is not mapped to an output, so all the attributes associated with it, in your case CountryName, will not show up.

The easiest way to prove it, is to add another root element that wraps your Country (equivalent to having a dummy "root" class that has a Country-type property).

<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Country"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

If you add the above schema fragment to your schema, you should get your expected results. At the beginning I thought that it has to do with the issue described here; while you can still use the tool to visualize the data set as described by the MSDN link above, in your case, the authoring style you suggested (basically a russian-doll) can't change the outcome.

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 通过 .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
  • 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
  • 在 C# 中从 XML Schema 生成代码有什么限制?(What are the limits to code generation from XML Schema in C#?)
    问题 我已经看到了几个关于使用xsd.exe从 XML 模式生成类的问题的问题,以及关于如何预处理模式(通常使用 XSLT)以在生成之前解决一些棘手方面的建议。 我的问题是是否有可能构建一个 100% 符合 XML Schema 的 C# 代码生成器。 xsd.exe的问题仅仅是它的实现问题,还是指出 XML Schema 和 C# 之间存在根本的不一致? 特别是,我对如何将 XML Schema 中的概念映射到 C# 感兴趣 - 什么是可接受的映射,哪些映射是有争议的,是否存在本质上不可映射的 XML Schema 构造以及是否存在未充分利用的 C# 构造? 是否有提供映射规则的合规性规范,以便可以实施和测试? 编辑:为了清楚起见,我完全知道 XML Schema 不会为我提供完全实现的 C# 接口,我对它是否可以完全映射到 C# 类层次结构感兴趣。 编辑 2:我添加了一个小赏金,因为我有兴趣获得更多细节。 编辑 3:赏金仍然开放,但到目前为止朝着 stakx 前进 - 一个很好的答案,但主要处理如何在 XML 模式中复制 C# 结构,而不是相反。 好的输入虽然。 回答1 有趣的问题。 不久前,我想知道完全相同的事情。 我将展示几个例子来说明我有多远。 我的演示并不完整(考虑到 XML Schema 规范相当全面),但它应该足以展示...... 您可以比xsd.exe
  • 无法生成类,因为找不到具有复杂类型的顶级元素(Cannot generate classes because no top-level elements with complex type where found)
    问题 我正在尝试使用 XSD.EXE 工具从 xsd 文件创建一个类。 但由于某种原因,我收到此错误。 警告:无法生成类,因为找不到具有复杂类型的顶级元素。 我在堆栈上环顾四周,看到我可以在复杂类型元素上放置一个类型,但我似乎无法让我工作。 这是 xsd 文件 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:complexType name="DocumentIdentification"> <xs:sequence> <xs:element name="Standard" type="xs:string"/> <xs:element name="TypeVersion" type="xs:string"/>
  • How to approach writing an F# type provider that enforces complex schema?
    Just recently I worked with some data for traffic and travel information, that is data in Datex2 format. The project wasn't long and is over now, and I went on as usually and generated a bunch of strongly typed C# classes with xsd.exe tool, did some serializing, light processing and so forth. However, now in hindsight I became to wonder if this would have been a good case for an F# type provider and so to take my first stab on this subject. With this in mind, how should one approach a situation where there's a complex schema that shouldn't change often? As there isn't a publicly available type
  • 如何编写强制执行复杂架构的 F# 类型提供程序?(How to approach writing an F# type provider that enforces complex schema?)
    问题 就在最近,我处理了一些交通和旅行信息数据,即 Datex2 格式的数据。 项目时间不长,现在已经结束了,我照常继续,用 xsd.exe 工具生成了一堆强类型的 C# 类,做了一些序列化、轻处理等。 但是,现在回想起来,我开始怀疑这对于 F# 类型提供程序是否是一个很好的案例,因此我第一次尝试这个主题。 考虑到这一点,应该如何处理存在不应该经常更改的复杂模式的情况? 由于没有公开可用的类型提供程序可以直接从模式推断类型,我想选项是: 使用 XML 类型提供程序。 使用外部工具生成类型,在本例中为 xsd.exe —— 从 WSDL 类型提供程序(使用 svcutil.exe)获取提示。 手动滚动类型(可能修改 xsd.exe 的输出)。 生成类型(如前面的项目符号)/使用 XML 类型提供程序并在后台进行不断的序列化、反序列化和模式验证。 然后我也开始想知道 C#-F# 的故事(例如生成或擦除的类型),如果我想修改类型以更好地检查约束,例如<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">在架构中同时提供良好的开发人员体验。 滚动自己的类型看起来相当费力,最后两点似乎是最吸引人的,所以采用 nos 在另一篇 SO 帖子中描述的路线。 我使用System
  • 如何从具有公共包含的 xsd 生成多个类?(How can I generate multiple classes from xsd's with common includes?)
    问题 阿罗哈 我收到了一些不错的 xsd 文件,我想将它们转换为类(使用 xsd.exe)所有的 xsd 都包含相同的内容,如下所示: <xs:include schemaLocation="kstypes.xsd" /> <xs:include schemaLocation="ksparams.xsd" /> 当我为每个 xsd 生成一个类时,这些文件中声明的类型会为每个原始 xsd 复制。 有什么简单的方法可以 1) 只生成一次包含的 xsd 中的类型,2) 确保所有其他类都使用这些类型? -Edood 回答1 查看文档,“最佳”方法(不是简单的方法!)似乎是在第二个和后续文件上使用 /element: elementname命令行开关来指定要为其生成类的类型。 回答2 尝试这里概述的方法:http://blog.hosca.com/blog/fpmlgen/
  • 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
  • How can I generate multiple classes from xsd's with common includes?
    Aloha I received a few nice xsd files which I want to convert to classes (using xsd.exe) All the xsd's have the same includes, like this: <xs:include schemaLocation="kstypes.xsd" /> <xs:include schemaLocation="ksparams.xsd" /> When I generate a class for each xsd the types declared in these files are duplicated for each original xsd. Is there any easy way to 1) only generate the types in the included xsd's once and 2) make sure all other classes use these types? -Edoode
  • 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的一部分
  • 使用多种类型反序列化 XML(Deserialize XML with multiple types)
    问题 我正在尝试反序列化 XML,其中一些相同的名称标签具有不同的 xsi 类型: <user-defined-data-row> <field name="entity"> <field-value xsi:type="field-text-valueType"> <value>Test</value> </field-value> </field> <field name="expiry_date"> <field-value xsi:type="field-date-valueType"> <value>2001-10-07</value> </field-value> </field> </user-defined-data-row> 这很容易通过将 xml 反序列化为这个模型来实现: [XmlRoot(ElementName = "field-value", Namespace = "http://www.crsoftwareinc.com/xml/ns/titanium/common/v1_0")] [XmlType("field-text-valueType")] public class Fieldvalue { [XmlElement(ElementName = "value", Namespace = "http://www.crsoftwareinc.com
  • .NET 2.0 SDK程序-每个工具做什么?(The .NET 2.0 SDK Programs - What does each tool do?)
    问题 我的问题很简单。 他们在做什么? 下面的可接受答案是框架中附带的.NET SDK工具的列表。 回答1 该答案涵盖了简短的描述,并提供了所有.NET SDK工具的链接。 如果您有其他任何信息,或者知道缺少任何工具,请随时进行编辑。 al.exe-程序集链接器从一个或多个模块或资源文件中生成带有程序集清单的文件。 模块是没有汇编清单的Microsoft中间语言(MSIL)文件。 如果您具有一个或多个模块(不带清单的元数据),则可以使用此模块创建一个清单,且清单在单独的文件中。 apatch.exe-使用Delta压缩API,并且专门使用PE文件的知识来改善压缩技术。 它是Windows安装程序技术的一部分。 优点:比发布新的DLL小; 仅当受众具有原始DLL时,此修补程序才有用。 因此,您可以自由发布补丁程序,而不必担心盗版。 aspnet_merge.exe-使用ASP.NET Merge工具可以组合和管理由ASP.NET编译工具(Aspnet编译器)创建的程序集。 ASP.NET合并工具可用于通过使用ASP.NET 2.0版或更高版本创建的程序集。 这样就可以进行以下操作:为整个网站创建一个程序集; 为每个网站文件夹创建一个程序集,并在程序集名称中添加一个前缀; 仅为网站用户界面(UI)元素(例如页面和控件)创建单个程序集。 AxImp.exe
  • XSD.exe 和“循环组引用”(XSD.exe and "Circular Group references")
    问题 我正在尝试构建一些类,以便我可以反序列化由第三方应用程序创建的 XML 文件。 幸运的是,第 3 方应用程序的开发人员在他们的代码中包含了一个模式文件,以便可以理解 XML 文件。 当我从 Visual Studio 使用 XSD.exe 工具时,进程失败报告以下错误 “来自 targetNamespace='' 的组 'SegGroupOrSegmentGrouping' 的定义无效:循环组引用。” 任何有关如何根据此错误生成类文件的帮助将不胜感激。 可以在此处找到架构文件的副本:架构文件 回答1 尝试使用svcutil ; 它可以处理循环引用。 在以下示例中, eExact-Schema.xsd是xsd.exe无法处理的 XSD。 例子: C:\SRC\Exact>svcutil eExact-Schema.xsd /language:C# /dataContractOnly /importxmltypes /out:exact.cs 这总是一个很好的起点; 您现在可以使用这个类并根据您的风格/需要进行更改,添加评论等,这将为您节省大量时间/搜索而不是从头开始。 回答2 我最近遇到了同样的问题, 我从第三方公司获得了一个架构,他们从 Web 服务返回一个 xml 结构。 然后我想反序列化响应并将信息存储到带有 NHibernate 的数据库中。 没问题,我以为我会只使用
  • 使用 WCF 的契约优先 SOA(Contract-First SOA with WCF)
    问题 这个问题更像是探索人们在实际情况下在社区中所做的事情,而不是一个有针对性的问题。 我对此进行了相当广泛的搜索,虽然我发现很多博主提倡契约优先服务设计和一些支持他们的评论,但我还没有找到很多关于使用 WCF 实施契约优先的实用信息,利弊我最近对 ​​SOA 做了一些广泛的研究,主要是通过 Thomas Erl 的书,他提倡的主要概念之一是契约优先设计。 我的问题如下: 您如何使用 .NET 和 WCF 进行契约优先服务设计? 除了 svcutil 之外,还有其他工具可以从合约生成客户端和服务吗? (任何与 VS 集成的东西都是理想的) 您在契约优先设计和 wCF 方面遇到过哪些现实世界的专业人士? 你在契约优先设计和 WCF 中遇到过哪些现实世界的缺点? 契约优先开发的主要问题之一似乎是工具。 Svcutil 是我发现的唯一可以从合约生成服务代码的东西,它的输出非常差。 它的单个文件,充满了属性和代码生成工件,并且基本上需要在合约更新时重新生成和替换。 我更喜欢更好的方法,最好是不需要重新替换的方法。 我什至可以手动创建服务端合同,假设它在现实世界中是实用的。 编辑: 虽然 WCSF 解决了我的迫切需求,但学习 Protocol Buffers 和 Service Factory 都是很有趣的工具,我相信它们将来会对我有所帮助。 回答1 WSCF 提供了一个与 VS
  • 如何以编程方式从类型生成xml模式?(How do I programmatically generate an xml schema from a type?)
    问题 我正在尝试以编程方式从任何.net类型生成xs:schema。 我知道我可以使用反射并通过遍历公共属性来生成反射,但是有内置的方法吗? 例子: [Serializable] public class Person { [XmlElement(IsNullable = false)] public string FirstName { get; set; } [XmlElement(IsNullable = false)] public string LastName { get; set; } [XmlElement(IsNullable = true)] public string PhoneNo { get; set; } } 所需的输出: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Person" type="Person" /> <xs:complexType name="Person"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="FirstName" type="xs:string" /> <xs:element minOccurs="0"
  • 不带xsd.exe的XML序列化和架构(XML Serialization and Schema without xsd.exe)
    问题 我使用XML序列化读取Config-POCO。 要在Visual Studio中获得对XML文件的智能感知支持,我需要一个模式文件。 我可以使用xsd.exe mylibrary.dll创建架构,并且可以正常工作。 但是我希望如果将对象序列化到文件系统中,则始终创建架构。 有没有不使用xsd.exe的方法吗? 回答1 查看System.Xml.Serialization.XmlSchemaExporter类。 我不记得确切的细节,但是该命名空间中有足够的功能来满足您的要求。 回答2 谢谢,这对我来说是正确的方法。 解决方案: XmlReflectionImporter importer = new XmlReflectionImporter(); XmlSchemas schemas = new XmlSchemas(); XmlSchemaExporter exporter = new XmlSchemaExporter(schemas); Type type = toSerialize.GetType(); XmlTypeMapping map = importer.ImportTypeMapping(type); exporter.ExportTypeMapping(map); TextWriter tw = new StreamWriter(fileName + "
  • 为什么 svcutil.exe 的 /reference 选项不起作用?(Why doesn't the /reference option to svcutil.exe work?)
    问题 我正在尝试使用 svcutil.exe 从一组 .wsdl 文件中仅生成服务合同(接口)。 当我这样做时(从 http 托管的 wsdl),它会选择包含的模式并为它们生成所有代码。 伟大的。 但是,我真正想做的是使用 xsd.exe 工具从架构文件生成的一组类(这样做的原因并不重要,只要说我需要在一个组件,而服务合同在另一个中)。 我成功地生成了一个包含所有类型的程序集。 当我尝试让 svcutil.exe 使用该程序集中的类型时会出现问题。 我的命令行看起来像这样: svcutil /target:code /noconfig /reference:my_types.dll http://path/to/wsdl 这工作正常,但生成的代码包含 my_types.dll 文件中所有类型的重复项。 我从 svcutil.exe 的文档中了解到,这正是 /reference: 参数旨在克服的问题。 但是,就我而言,它不起作用。 为什么? 回答1 显然它只适用于 DataContract 类型而不适用于 XmlSerializer 类型。 http://blogs.msdn.com/b/youssefm/archive/2009/10/09/reusing-types-in-referenced-assemblies-with-svcutil-sr-switch.aspx 回答2
  • What is the correct way of using the Guid type in a XSD file?
    I have a .xsd file which I use to generate code with the xsd.exe tool from Visual Studio. Some class members are Guids and the xsd.exe tool gives 2 warnings: Namespace 'http://microsoft.com/wsdl/types/' is not available to be referenced in this schema. Type 'http://microsoft.com/wsdl/types/:guid' is not declared. The Guid type is recognized because the generated C# file is valid and works. Anyone knows how to get rid of those warnings? What is the correct syntax for the XSD to be validated AND class members being generated as System.Guid?
  • XmlCodeExporter 和可为空类型(XmlCodeExporter and nullable types)
    问题 System.Xml.Serialization.XmlCodeExporter从 XSD 架构生成代码(以代码 CodeDom 形式)。 但它有一些怪癖。 例如一个可选元素: <xs:element name="Something" type="xs:decimal" minOccurs="0" maxOccurs="1"/> 我希望这会生成Nullable<decimal>类型的相应代码成员,但它实际上创建了一个类型为decimal的成员,然后是一个单独的SomethingSpecified字段,该字段应单独切换以指示空值。 这可能是因为该库是在引入可空类型之前的,但它导致代码非常不方便。 是否可以调整此代码生成,或者是否有替代工具可以在这种情况下生成更好的代码? 编辑:我知道我可以修改架构并添加nillable='true' ,但我不想更改架构来解决代码生成的限制。 回答1 Mike Hadlow撰写的文章编写您自己的 XSD.exe提供了用于创建您自己的xsd.exe版本的基本框架。 它有以下步骤: 使用 XmlSchema.Read() 和 XmlSchemaImporter 导入架构。 生成 .Net 类型和属性以使用 XmlCodeExporter 创建。 根据需要调整生成的类型和属性。 在这里,您可能希望删除生成的xxxSpecified属性并将其相应的“真实