如何在xsd:enumeration中使用任何字符串

时间:2013-01-16 08:17:24

标签: xml xsd

我有这样的xsd类型

<xsd:simpleType name="carsEnum">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="Seat"/>
        <xsd:enumeration value="Opel"/>
    </xsd:restriction>
</xsd:simpleType>

现在我可以这样使用它 - <xsd:attribute name="carModel" type="carsEnum"/>

如何重建carEnum以使用任何其他字符串?

作为一个例子 -

< ... carModel="Seat"/>
< ... carModel="Some string"/>
< ... carModel="Opel"/>

因为我可以像往常一样制作类型carsEnum String,但在IDE Idea中使用这样的构造相当舒服,因为它显示了工具提示。

2 个答案:

答案 0 :(得分:9)

如果我总结一下你的问题我理解的是你想要维护一个元素汽车的可能值列表,也想接受出现在有界列表之外的任何值。这可以使用UNION在XSD中实现。我已经用下面的例子说明了它。

示例XML:

<?xml version="1.0" encoding="utf-8"?>
<cars>ssd</cars>

XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="cars" type="carsType"/>
  <xs:simpleType name="carsType">
    <xs:union memberTypes="carsEnum carsAnyString"/>
  </xs:simpleType>
  <xs:simpleType name="carsEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Seat"/>
      <xs:enumeration value="Opel"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="carsAnyString">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
</xs:schema>

在上面的XSD中,我使用CAR的多个定义,一次作为枚举列表,一次作为任何字符串。定义组合这两者的UNION类型将是汽车的type

所以<cars可以有以下值: Seat,Opel,anyOtherCar,AnyString2 ..

我还想提一种控制ANY STRING值的方法。 XSD以上可以接受任何字符串甚至是特殊的字符和数字。我们可以通过仅将restriction pattern添加到Alpha字符来限制此操作。以下是XSD代码:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="cars" type="carsType"/>
  <xs:simpleType name="carsType">
    <xs:union memberTypes="carsEnum carsAnyAlphaString"/>
  </xs:simpleType>
  <xs:simpleType name="carsEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Seat"/>
      <xs:enumeration value="Opel"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="carsAnyAlphaString">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Za-z]*"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

所以可能的值可以是Seat, Opel, "Any string but no Number", "Any string but no special char"

替换

      `<xs:pattern value="[A-Za-z]*"/>`

通过

      <xs:pattern value="[A-Za-z]+"/>

不允许空字符串。 这是一种重新定义元素的方法..不仅仅是坚持枚举列表。

现在你的模式也有枚举列表。希望它有所帮助。

答案 1 :(得分:1)

只需添加其他元素

<xsd:simpleType name="carsEnum">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="Seat"/>
        <xsd:enumeration value="Opel"/>
 <xsd:enumeration value="SeatNew"/>
 <xsd:enumeration value="OpelNew"/>
    </xsd:restriction>
</xsd:simpleType>

因此您可以将SeatNew和OpelNew分配给您的carModel。

但是你不能为carModel分配任意值,除非在其中指定,因为它将被转换为java enum。