.Net xsd.exe工具不会生成所有类型

时间:2010-01-26 19:58:44

标签: .net visual-studio xsd.exe

出于某种原因,MS .Net(v3.5)工具 - xsd.exe在任何元素中未使用时都不会生成类型。

e.g。

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:simpleType name="EnumTest">
    <xs:restriction base="xs:string">
      <xs:enumeration value="item1" />
      <xs:enumeration value="item2" />
      <xs:enumeration value="item3" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="myComplexType">
    <xs:attribute name="Name" use="required" type="xs:string"/>
  </xs:complexType>
  <xs:element name="myElem" type="myComplexType"></xs:element>
</xs:schema>

当我使用

运行xsd.exe时
  

xsd / c xsdfile.xsd

我在生成的cs文件中看不到EnumTest。

请注意;即使我不在这里使用枚举,但在我的实际项目中,我有这样的情况,我们将枚举的字符串值作为输出发送。

如何强制xsd工具包含这些?或者我应该切换到其他工具?

我在Visual Studio 2008中工作。

5 个答案:

答案 0 :(得分:5)

我必须得出结论,这是该工具的一个愚蠢的缺点。也许给开关打开这个行为。由于没有这种行为,我不得不在xsd之外创建类型并创建碎片代码。

这是我个人的意见,我很确定还有其他人会分享同样的意见。

答案 1 :(得分:3)

我知道这已经很老了,但是当我搜索时它出现在Google上,我找到了答案。

Xsd必须至少有一个xs:元素才有效,xsd.exe才能正常工作。

请查看此信息以获取更多信息 http://keithelder.net/2008/11/02/creating-a-rest-wcf-service-from-an-existing-xsd-schema/

答案 2 :(得分:2)

即使您不打算使用它们进行验证,也可以在XSD文件中创建枚举。将以下内容添加到XSD:

<xs:element name="DummyEnumTest" type="EnumTest" abstract="true" block="#all"/>

(其中EnumTest是您想要生成的枚举)。

abstract属性确保元素不能扮演实例文档的文档元素的角色。 block属性不太重要。

还有其他方法可以实现相同的目标,例如在您喜欢的任何地方使用枚举类型声明禁止属性。我觉得将所有未使用的枚举封装在这样的通用包装中是有用的,以最小化全局声明:

<xs:element name="ForceGenerationOfBaseEnums" abstract="true" block="#all">
    <xs:complexType>
        <xs:choice>
            <xs:element name="..." type="..."/>
            <xs:element name="..." type="..." />
        </xs:choice>
    </xs:complexType>
</xs:element>

答案 3 :(得分:1)

我遇到了类似的问题,xs:complexType不在xs:element内,因此未包含在生成的cs文件中。在我们的场景中,我们有一个导入两个xsd文件的wsdl文件,因此这可能不适用于您。

我们没有在这两个xsd文件上运行xsd.exe,而是执行了以下操作:

wsdl.exe /language:CS /out:OutputDir OurService.wsdl first.xsd second.xsd

这就像一个魅力,并产生了一切,包括复杂的类型。

答案 4 :(得分:0)

如果您不在此处使用枚举,或者您正在通过xsd工具生成任何其他类,请在项目中的其他位置定义它,就像您使用任何其他枚举一样。如果您绝对需要让xsd工具为您创建一个类,那么Workshop Alex的解决方案是这种情况下最常用的解决方法(我甚至不认为它是一种解决方法,它实际上非常方便能够使用这样的工具)