Проверка XML на XSD завершилась неудачно, когда узел имеет несколько дочерних элементов - PullRequest
3 голосов
/ 08 марта 2011

Мне нужно сгенерировать XSD для XML-файла, который мы будем использовать между системами, чтобы мы могли проверить правильность получаемых данных.

XML выглядит так (но с большим количеством полей):

<Request>
<Request_ID>1000012295</Request_ID>
<Extra_Info>
  <Item>
    <Item_Number>0000000001</Item_Number>
    <ItemDescription>test- 2</ItemDescription>    
  </Item>
  <Item>
    <Item_Number>0000000002</Item_Number>
    <ItemDescription>test - 2</ItemDescription>
  </Item>
</Extra_Info>
</Request>

и мой XSD выглядит следующим образом:

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Request">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Request_ID" type="xsd:int" />
        <xsd:element name="Extra_Info">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Item">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="Item_Number" type="xsd:int" />
                    <xsd:element name="ItemDescription" type="xsd:string" />
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Эта схема работает, когда у меня есть только один Item узел, но как только у меня есть более одного, я получаю следующееошибка:

Элемент 'Extra_Info' имеет недопустимый дочерний элемент 'Item'.

почему он не работает, если он указан в виде последовательности?

Спасибо!

PS: я использовал Этот онлайн-валидатор для быстрой проверки, но я также получаю ту же ошибку с XMLReader

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

По умолчанию min и max для элемента установлены в 1, даже если они определены внутри последовательности

ваше определение элемента Extra_Info должно быть следующим:

<xsd:element name="Extra_Info">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="Item" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Item_Number" type="xsd:int" />
            <xsd:element name="ItemDescription" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Примечание: неограниченноеатрибут, который указывает, что вы можете иметь 1 или более из этих элементов.

Чтобы иметь любое количество элементов, вы можете добавить minOccurs = '0' к элементу элемента, чтобы он выглядел так:

<xsd:element name="Item" maxOccurs="unbounded" minOccurs="0">
2 голосов
/ 08 марта 2011

Вы должны добавить атрибут maxOccurs="unbounded" к элементу Item в вашем файле xsd.

...