【发布时间】:2016-05-27 11:05:42
【问题描述】:
我们使用的提要包含如下元素:
<animals>
<cow>
<name>Daisy</name>
<weight>250</weight>
<age>4</age>
</cow>
<pig>
<name>45tyyy</name>
<weight>80</weight>
<age>2</age>
</pig>
<sheep>
<name>Lamby</name>
<weight>50</weight>
<age>7</age>
</sheep>
</animals>
XSD 可能如下所示:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="animals">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="cow">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:short" name="weight"/>
<xs:element type="xs:byte" name="age"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pig">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:byte" name="weight"/>
<xs:element type="xs:byte" name="age"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="sheep">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:short" name="weight"/>
<xs:element type="xs:byte" name="age"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
但是在我们的 C# 代码(和数据库)中,它们只是不同类型的动物,因此如果提要采用以下形式对我们来说会容易得多:
<animal type="cow">
<name>Daisy</name>
<weight>250</weight>
<age>4</age>
</animal>
或:
<animal>
<type>Cow</type>
<name>Daisy</name>
<weight>250</weight>
<age>4</age>
</animal>
我们希望使用 XSD.exe 或 XSD2Code 等自动工具来生成映射到 XML 的类,因此我们只有一个可以处理的 Animal 类。
我们无法更改提要,但如果有帮助,我们可以修改用于生成代码的 XSD - 例如定义一个扩展的基本 <animal> 类型,希望 C# 类随后包含基类动物?
另一个选择是我们可以将 XML 转换为我们希望的格式,而不是稍微修改的 XSD,大概使用 XSLT?
我在 XSD 或 XSLT 方面做得不多,尤其是在 C# 方面;那么可以如何使用代码生成工具获取输入 XML 并将其映射到单个 Animal 类?
【问题讨论】:
-
使用反序列化时,如果不更改提要,就不能拥有基类 Animals。饲料需要:
。因此,您必须编写自己的解析代码来读取 xml 代码并将结果放入使用 XSD 生成的类中。 -
我只是在想,如果 XSD 为每个重用相同的
complexType,自动生成的 C# 代码可能会通过仍然创建Cow,Pig,Sheep类来反映这一点,但来自一个共同的基地。我想这完全取决于我使用的工具,可能有点不太可能