XSD для XML со списком различных типов и типов переупорядочения - PullRequest
0 голосов
/ 22 марта 2012

Скажите, пожалуйста, как я могу создать схему xsd, которая успешно проверит следующее xml: Действительный XML 1

    <?xml version="1.0" encoding="UTF-8"?>
<start xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
  <list>
    <typeA>
      <value>test string value 123</value>
    </typeA>
    <typeB>
      <value>test string value 456</value>
    </typeB>
    <typeC>
      <value>test string value 789</value>
    </typeC>
  </list>
</start>

Действительный XML 2

    <?xml version="1.0" encoding="UTF-8"?>
<start xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
  <list>
    <typeB>
      <value>test string value 456</value>
    </typeB>
    <typeC>
      <value>test string value 789</value>
    </typeC>
  </list>
</start>

Действительный XML 3

    <?xml version="1.0" encoding="UTF-8"?>
<start xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
  <list>
    <typeC>
      <value>test string value 789</value>
    </typeC>
    <typeC>
      <value>test string value 123</value>
    </typeC>
  </list>
</start>

Действительный XML 4

    <?xml version="1.0" encoding="UTF-8"?>
<start xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
  <list>
    <typeC>
      <value>test string value 789</value>
    </typeC>
  </list>
</start>

Недопустимый XML 5 с типами переупорядочения

<?xml version="1.0" encoding="UTF-8"?>
<start xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
    <list>
        <typeB>
            <value>test string value 456</value>
        </typeB>
        <typeC>
            <value>test string value 789</value>
        </typeC>
        <typeA>
            <value>test string value 123</value>
        </typeA>
    </list>
</start>

Я написал XSD, но он не работает для XML с типами переупорядочения (XML 5):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="typeC">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="value" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="typeB">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="value" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="typeA">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="value" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="start">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="list"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="typeA" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="typeB" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="typeC" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Есть ли другой способ добиться этого?Решение должно работать для 5 различных файлов XML, перечисленных выше.

Заранее спасибо!

1 Ответ

1 голос
/ 22 марта 2012

Попробуйте, все работает:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="start">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="list" type="list"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="list">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="typeA" type="generic" />
        <xs:element name="typeB" type="generic" />
        <xs:element name="typeC" type="generic" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="generic">
    <xs:sequence>
      <xs:element name="value" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...