我正在编写一个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运行时,我最终得到了FileStructure
,Folder
和File
的类。 FileStructure有一个名为Folder的属性,它包含一个文件夹数组; Folder有一个名为Folder1的属性,它包含一个文件夹数组。
我不希望将Folder上的属性称为Folder1。使用XSD.exe时如何指定属性和类型的名称?
答案 0 :(得分:4)
你不能 - XSD会为你做那件事。你无法影响C#代码最终的结果。
您可以尝试做的是在XSD中使用类型,而不是内联定义所有内容。例如。定义一个<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模式更易于阅读和理解,更清晰,然后只使用那些定义的类型,而不是大量的复杂元素的内联定义及其内联类型。