XML-схема для последовательности элементов с тем же именем, но различными значениями атрибута?

Вы можете использовать команду x для печати с заданного адреса.

x (s_a*) 0x61b2e0

8
задан Abel 29 March 2012 в 08:39
поделиться

2 ответа

ПРИМЕЧАНИЕ этот ответ неверен, как указал Серж.

Тестирование с помощью xerces выдает эту ошибку: type.xsd: 3: 21 : cos-element-compatibility: Ошибка для типа '#AnonType_productinfo'. Несколько элементов с именем 'informationset', с разными типами, появляются в группе моделей. В спецификации для есть согласованность cos-element .

. Но есть решение, похожее на ответ Марка ниже, но все еще использующее типы. Можно иметь несколько экземпляров одного и того же с разными типами, если они находятся в списке супертипа minOccurs / maxOccurs, который расширен другими типами. То есть, как список полиморфных классов в Java или C #. Это устраняет проблему, описанную выше, потому что, хотя это имя элемента может появляться в xml много раз, оно встречается в xsd только один раз.

Вот пример xsd и xml, на этот раз протестированных с xerces !:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="productinfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="informationset" type="supertype" minOccurs="2" maxOccurs="2"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="supertype">
  </xs:complexType>

  <xs:complexType name="Manufacturer">
    <xs:complexContent>
      <xs:extension base="supertype">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Ingredients">
    <xs:complexContent>
      <xs:extension base="supertype">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

</xs:schema>

<productinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <informationset xsi:type="Manufacturer"></informationset>
  <informationset xsi:type="Ingredients"></informationset>
</productinfo>

ПРИМЕЧАНИЕ. Вы не можете управлять порядком различных типов или тем, сколько раз встречается каждый тип (каждый может появляться один раз, много раз или вообще не появляться) - так же, как со списком полиморфных классов в Java или C #. Но вы можете, по крайней мере, указать точную длину списка в целом (если хотите).

Например, я ограничил приведенный выше пример ровно двумя элементами, но порядок не установлен (т.е. Производитель может быть первым или Ингредиенты могут быть первыми); и число повторений не установлено (т.е. они оба могут быть Производитель , или оба Ингредиенты , или по одному на каждый).


Вы можете, с типом XML Schema , как в:

<productinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <informationset xsi:type="Manufacturer"></informationset>
  <informationset xsi:type="Ingredients"></informationset>
</productinfo>

И XSD определяет отдельные комплексные типы для каждого:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="productinfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="informationset" type="Manufacturer"/>
        <xs:element name="informationset" type="Ingredients"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Manufacturer">
  </xs:complexType>
  <xs:complexType name="Ingredients">
  </xs:complexType>
</xs:schema>

Это особый случай для xsi: type . В общем, не думайте, что вы можете указывать атрибуты с разными значениями в элементах с одинаковым именем, потому что это разные определения одного и того же элемента.

Я не на 100% ясен по точной причине - кто-нибудь знает соответствующая часть спецификации?

3
ответ дан 5 December 2019 в 22:20
поделиться

Вы можете попробовать что-то вроде этого - создать отдельный complexType для ваши элементы "informationSet" и ограничьте атрибут списком допустимых строк:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="productinfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" 
                    name="informationset" type="informationSetType" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="informationSetType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="type" type="validAttributeType" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="validAttributeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Manufacturer" />
      <xs:enumeration value="Ingredients" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Конечно, вы можете расширить этот список допустимых имен атрибутов, если хотите - просто добавьте туда больше элементов в список ограничений-перечислений.

] Марк

2
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: