7

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

例如

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 中工作。

4

5 回答 5

4

我知道这很老了,但是当我搜索时它出现在谷歌中,我找到了答案。

Xsd 必须至少有一个 xs:element 才能有效并且 xsd.exe 才能正常工作。

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

于 2010-11-30T09:53:49.100 回答
4

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

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

于 2011-01-24T16:15:08.317 回答
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>
于 2012-11-05T09:52:34.617 回答
1

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

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

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

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

于 2012-02-28T11:07:32.943 回答
0

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

于 2010-07-28T15:52:58.633 回答