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

协助XML XSD在多个元素之间进行选择,xml,xsd,Xml,Xsd,我有一个XML文档,如下所示: <?xml version="1.0" encoding="utf-8"?> <Data> <AddressStreetNumber>123</AddressStreetNumber> <AddressStreetName>Main St</AddressStreetName> <AddressUnitNumber>10-B</Addres

我有一个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>

123
主街
10-B
恰当的
123主街10-B号公寓
我希望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的第一次尝试,我相信它会证明这一点。非常感谢您的帮助。

此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 version="1.0" encoding="utf-8"?>
<Data>
  <AddressLine1>123 Main St Apt 10-B</AddressLine1>
</Data>
<?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>

123
主街
10-B
恰当的
和此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 version="1.0" encoding="utf-8"?>
<Data>
  <AddressLine1>123 Main St Apt 10-B</AddressLine1>
</Data>
<?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>

123主街10-B号公寓
与此XSD有效:

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