2

我正在编写一个 XSD 模式,它有一个描述文件结构的元素:

<xs:schema
  ...
>
  <xs:element name="FileStructure">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Folder" minOccurs="1" maxOccurs="1" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Folder">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />
        <xs:element ref="File" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="AccessionFile">
    <xs:complexType mixed="true">
      ...
    </xs:complexType>
  </xs:element>
</xs:schema>

当我通过 XSD.exe 运行它时,我最终得到了FileStructureFolderFile. FileStructure 有一个名为 Folder 的属性,它包含一个文件夹数组;Folder 有一个名为 Folder1 的属性,它包含一个文件夹数组。

我不希望将 Folder 上的属性称为 Folder1。使用 XSD.exe 时如何指定属性和类型的名称?

4

1 回答 1

4

你不能——XSD 会为你做到这一点。您无法影响 C# 代码最终的外观。

您可以尝试做的是在 XSD 中使用类型,而不是内联定义所有内容。例如定义 a<xs:complexType name="FolderType">然后在你的主要定义中使用它:

  <xs:complexType name="FolderType">
    <xs:sequence>
      <xs:element name="Folder" type="FolderType" minOccurs="0" maxOccurs="unbounded" />
      <xs:element ref="File" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>

  <xs:sequence>
     <xs:element name="Folder" type="FolderType" minOccurs="1" maxOccurs="1" />
  </xs:sequence>

也许这为您提供了更多命名的灵活性,因为它将类型及其定义与用作元素名称的实际名称分离。

另外,一般来说,当我将事物定义为显式类型(复杂或简单类型)然后只使用这些定义的类型而不是使用大量复杂的内联定义时,我发现我的 XML 模式更易于阅读、理解和清洁元素及其内联类型。

于 2009-11-23T11:32:48.337 回答