这对xml架构来说是一个很好的语法吗?

时间:2013-08-02 14:09:39

标签: xml xsd computer-science grammar

如果我有这些规则:

PIZZA-->doughSAUCECHEESE

SAUCE-->marinara | bbq | pesto

CHEESE-->mozarella | 

比萨饼串由文字“面团”组成,后面是3个调味汁中的一个。它可以在那里结束(没有奶酪)或以文字'mozarella'结束。 这是我的xml架构:

<xs:element name="pizza">
  <xs:complexType>
    <xs:element name="doughLiteral" type="xs:string" fixed="dough"/>
    <xs:element name="sauce">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="marinara"/>
          <xs:enumeration value="bbq"/>
          <xs:enumeration value="pesto"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name="cheese">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="mozarella"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value=""/>
        </xs:restriction> 
      </xs:simpleType>
    </xs:element>
  </xs: complexType>
</xs: element>

我不确定我是否正确指定了空字符串。另外,我读到默认情况下属性是可选的,默认情况下元素是正确的,即上面的模式表明必须有1个酱?谢谢。

1 个答案:

答案 0 :(得分:1)

默认情况下,元素是强制性的,以使其可选使用minOccurs="0"

您缺少xs:sequencexs:simpleType元素定义中使用的双cheese不正确。

正确的架构应该是这样的:

<xs:element name="pizza">
  <xs:complexType>
    <xs:sequence>
    <xs:element name="doughLiteral" type="xs:string" fixed="dough"/>
    <xs:element name="sauce">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="marinara"/>
          <xs:enumeration value="bbq"/>
          <xs:enumeration value="pesto"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name="cheese" minOccurs="0">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="mozarella"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

话虽如此,正如@seki正确地指出这个模式定义了一个XML结构,如:

<pizza>
  <doughLiteral>dough</doughLiteral>
  <sauce>marinara</sauce>
  <cheese>mozzarella</cheese>
</pizza>

不是您在问题开头指定的纯文本语法。