代码之家  ›  专栏  ›  技术社区  ›  François Beausoleil

如何在XML架构中将非字符串元素声明为具有可选内容

xsd
  •  0
  • François Beausoleil  · 技术社区  · 15 年前

    我见过 XML Schema element with attributes containing only text 但我有一个元素,它是xs:datetime。

    我尝试为其编写架构的文档如下所示:

    <web-campaigns>
      <web-campaign>
        <id>1231</id>
        <start-at nil="true"/>
      </web-campaign>
      <web-campaign>
        <id>1232</id>
        <start-at>2009-08-08T09:00:00Z</start-at>
      </web-campaign>
    </web-campaigns>
    

    有时xs:datetime元素有内容,有时没有。

    到目前为止(还没有验证)我所拥有的是:

    <xs:element name="start-at">
      <xs:complexType mixed="true">
        <xs:simpleContent>
          <xs:extension base="xs:dateTime">
            <xs:attribute name="nil" default="false" type="xs:boolean" use="optional" />
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
    </xs:element>
    

    如果我用xs:string替换xs:datetime,我可以很好地验证文档,但我真的希望xs:datetime向消费者指示该元素中的内容。我试过有没有 混合=“真” 同样,也无济于事。

    如果有区别,我会使用xmlint(在Mac OS X 10.5上)和 XML Schema Validator

    2 回复  |  直到 13 年前
        1
  •  1
  •   skaffman    15 年前

    你需要

    <xs:element name="start-at" minOccurs="0">
    

    混合模式与你的情况无关,你不需要。默认情况下, minOccurs="1" ,即元素是必需的。

    使用minoccurs=“0”,可以使用内容指定元素,或者根本不指定元素。如果你想允许 <start-at/> ,则不能使用xs:datetime。

        2
  •  4
  •   robbie    13 年前

    您可以将自己的类型定义为类型联合。

    1/将“空”类型定义为只允许“无”的字符串。

    <xs:simpleType name="empty">
      <xs:restriction base="xs:string">
        <xs:enumeration value=""/>
      </xs:restriction>
    </xs:simpleType>
    

    2/下一步定义允许日期和空值的类型

    <xs:simpleType name="empty-dateTime">
      <xs:union memberTypes="xs:dateTime empty"/>
    </xs:simpleType>
    

    3/将所有可为空的日期时间元素声明为 type="empty-dateTime"