xs:choice是否等同于C ++枚举?

时间:2009-06-17 13:03:17

标签: xml xml-serialization xsd

我们通过MS XML 4完成了大量序列化。当我们序列化C ++枚举时,我们使用表将每个可能的值转换为字符串,并将该字符串存储为属性值。当我们反序列化时,我们读取该属性值,将其与表中的所有项进行比较并检索相应的枚举值。如果我们找不到错误。

为了便于外部程序创建XML,我们为所有感兴趣的数据类型发布了XML模式。枚举的属性定义如下:

<xs:complexType>
    //other fields here
    <xs:attribute name="Color" type="xs:string"></xs:attribute>
</xs:complexType>

它有效,但不包含可能的字符串值的定义。如何为此定义添加可能的值?我是否使用xs:choice?

2 个答案:

答案 0 :(得分:3)

不,xs:choice为模式提供的信息表明“在这个地方,你可以拥有这个或这个或者这个,但不是一个组合”;您可以找到有关xs:choice here的更多信息。

要创建枚举,您需要根据xs:string将其定义为restricted type的一部分。

例如:

<xs:simpleType name="ColorType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="white"/>
    <xs:enumeration value="black"/>
    <xs:enumeration value="blue"/>
  </xs:restriction>
</xs:simpleType>

然后您可以像任何其他类型一样使用此类型:

<xs:complexType>
  <xs:attribute name="Color" type="ColorType" />
</xs:complexType>

有关using xs:restriction和其他XSD元素及属性的详细信息,请查看www.w3schools.com。他们有很多关于网络相关主题的参考指南和教程,如XHTML,XSLT,XPath和XSD(以及javascript和AJAX)。

答案 1 :(得分:0)

<xs:complexType>
  //other fields here
  <xs:attribute name="Color">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="RED"/>
        <xs:enumeration value="BLUE"/>
        <xs:enumeration value="GREEN"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>
</xs:complexType>

您也可以将其创建为外部类型:

<xs:complexType>
  //other fields here
  <xs:attribute name="Color" type="Color"/>
</xs:complexType>
<xs:simpleType name="Color">
  <xs:restriction base="xs:string">
    <xs:enumeration value="RED"/>
    <xs:enumeration value="BLUE"/>
    <xs:enumeration value="GREEN"/>
  </xs:restriction>
</xs:simpleType>

<xs:choice>完全意味着别的东西。 XML模式中的名称不直观且有些误导。选择意味着其中一个元素。