协助XML XSD在多个元素之间进行选择

时间:2013-11-21 00:31:01

标签: xml xsd

我有一个XML文档:

<?xml version="1.0" encoding="utf-8"?>
<Data>
      <AddressStreetNumber>123</AddressStreetNumber>
      <AddressStreetName>Main St</AddressStreetName>
      <AddressUnitNumber>10-B</AddressUnitNumber>
      <AddressUnitType>Apt</AddressUnitType>
      <AddressLine1>123 Main St Apt 10-B</AddressLine1>
</Data>

我希望XSD中的定义记录要包含的前4个元素或要包含的最后一个元素。基本上,消费者可以选择拆分地址或仅使用元素“addressline1”来放置整个address1信息。我如何在XSD中描述这一点?我尝试过使用xsd:group和xsd:choice但它似乎无法工作(或验证)。

示例:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:group name="householdaddress1parts">
    <xs:all>
      <xs:element name="AddressStreetNumber" type="xs:unsignedInt" minOccurs="0" />
      <xs:element name="AddressStreetName"  minOccurs="0" >
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="100"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="AddressUnitNumber" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="16"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="AddressUnitType" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="16"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:all>
  </xs:group>
  <xs:group name="householdaddress1">
    <xs:all>
      <xs:element name="AddressLine1" minOccurs="0" >
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="164"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:all>
  </xs:group>
  <xs:choice minOccurs="0">
          <xs:group ref="householdaddress1parts"></xs:group>
          <xs:group ref="householdaddress1"></xs:group>
        </xs:choice>
</xs:schema>

我已经尝试了其他一些变化,但我猜我甚至在阅读了一段时间的文档之后完全偏离了轨道(或者它可能是非常明显的事情)。这是我第一次涉足XSD,我确信它会显示出来。对此有任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

此XML文档:

<?xml version="1.0" encoding="utf-8"?>
<Data>
  <AddressStreetNumber>123</AddressStreetNumber>
  <AddressStreetName>Main St</AddressStreetName>
  <AddressUnitNumber>10-B</AddressUnitNumber>
  <AddressUnitType>Apt</AddressUnitType>
</Data>

这个XML文档:

<?xml version="1.0" encoding="utf-8"?>
<Data>
  <AddressLine1>123 Main St Apt 10-B</AddressLine1>
</Data>

对此XSD有效:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Data">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="AddressStreetNumber"/>
          <xs:element name="AddressStreetName"/>
          <xs:element name="AddressUnitNumber"/>
          <xs:element name="AddressUnitType"/>
        </xs:sequence>
        <xs:element name="AddressLine1"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>   
</xs:schema>