【问题标题】:XSD defines three identical types I want to map to one classXSD 定义了我想映射到一个类的三种相同类型
【发布时间】: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 - 例如定义一个扩展的基本 &lt;animal&gt; 类型,希望 C# 类随后包含基类动物?

另一个选择是我们可以将 XML 转换为我们希望的格式,而不是稍微修改的 XSD,大概使用 XSLT?

我在 XSD 或 XSLT 方面做得不多,尤其是在 C# 方面;那么可以如何使用代码生成工具获取输入 XML 并将其映射到单个 Animal 类?

【问题讨论】:

  • 使用反序列化时,如果不更改提要,就不能拥有基类 Animals。饲料需要:。因此,您必须编写自己的解析代码来读取 xml 代码并将结果放入使用 XSD 生成的类中。
  • 我只是在想,如果 XSD 为每个重用相同的 complexType,自动生成的 C# 代码可能会通过仍然创建 Cow,Pig,Sheep 类来反映这一点,但来自一个共同的基地。我想这完全取决于我使用的工具,可能有点不太可能

标签: c# .net xml xslt xsd


【解决方案1】:

另一种选择是我们可以将 XML 转换为我们希望的格式 针对稍微修改的 XSD,大概使用 XSLT?

这在 XSLT 中是很简单的:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="cow | pig | sheep">
    <animal type="{name()}">
        <xsl:apply-templates/>
    </animal>
</xsl:template>

</xsl:stylesheet>

这不需要 XSD。

【讨论】:

  • 是的,我只是想调整提要 XSD 以提供 &lt;animal&gt; 类型,以便我可以自动生成 C# Animal 类?
  • 如果您有机会扩展您的答案,我将如何在 C# (.net 4.5) 中给定 string xml=... 应用此转换
  • 对不起,我对此一无所知。
  • 没问题,我确定有一个 SO 问题
  • 我终于在真正的 XML 上进行了测试,它运行良好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多