Почему XSD говорит, что мой элемент не завершен? - PullRequest
5 голосов
/ 06 февраля 2010

У меня есть XSD этой формы:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/example"
    xmlns:tns="http://www.example.org/example" elementFormDefault="qualified">

    <complexType name="bType">
    </complexType>

    <complexType name="aType">
        <choice maxOccurs="unbounded">
            <element name="a" type="tns:aType" />
            <element name="b" type="tns:bType" />
        </choice>
    </complexType>

    <element name="topelement">
        <complexType>
            <sequence>
                <element name="a" type="tns:aType" maxOccurs="1" />
            </sequence>
        </complexType>
    </element>
</schema>

И XML-файл, который я ожидаю, чтобы соответствовать ему, например:

<?xml version="1.0" encoding="UTF-8"?>
<topelement xmlns="http://www.example.org/example"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/example example.xsd ">
  <a> <!-- Error on this line. -->
    <a/>
    <b/>
    <b/>
    <a/>
  </a>
</topelement>

К сожалению, XSD говорит, что это недопустимо со следующей ошибкой:

cvc-complex-type.2.4.b: The content of element 'a' is not complete. One of '{"http://www.example.org/example":a, "http://www.example.org/example":b}' is expected.  example.xml line 5

Насколько я могу судить, я сделал все, что мне нужно, чтобы тег был завершен. Я заполнил его неограниченным выбором тегов «a» и «b». Кто-нибудь может увидеть, что пошло не так?

Чтобы пояснить, я хочу, чтобы в топе был только один тег 'a', а под ним - сочетание тегов 'a' и 'b'.

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010

До публикации этого ответа я не наблюдал ваш собственный ответ .. В любом случае я не хочу тратить впустую потраченные усилия / время. Поэтому я не буду удалять это сообщение .. Вместе с тем же ответ я тоже .. написал несколько пунктов пожалуйста пройдите ..

ComplexType aType определяет, что у него всегда есть либо <a/>, либо <b/> в качестве дочерних элементов. Это означает, что .. где бы элемент <a/> ни появлялся, он должен иметь дочерний элемент <a/> или <b/> .. не верно .. как в соответствии с вашим входным XML.

Итак, это код XSD, который я написал для устранения ошибок (обратите внимание на атрибут «minOccurs» в коде .. потому что при отсутствии которого вы получаете ошибки ..)

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/example"
    xmlns:tns="http://www.example.org/example" elementFormDefault="qualified">
  <element name="topelement">
    <complexType>
      <sequence>
        <element name="a" type="tns:aType" minOccurs="0" maxOccurs="1" />
      </sequence>
    </complexType>
  </element>


  <complexType name="bType">
  </complexType>

  <complexType name="aType">
    <sequence>
      <choice maxOccurs="unbounded">
        <element name="a" type="tns:aType" minOccurs="0"/>
        <element name="b" type="tns:bType" minOccurs="0"/>
      </choice>
    </sequence>
  </complexType>
</schema>

Итак, согласно моему коду .. Тег <a/> может иметь или не иметь никаких дочерних элементов.
Если вы не хотите изменять файл XSD .. тогда ваш XML должен иметь тег <a/> или <b/> как дочерние элементы <a/> .. как то так:

<topelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.example.org/example" xsi:schemaLocation="http://www.example.org/example example.xsd">
    <a>
    <a>
      <b/>
    </a>
    <b/>
    <b/>
    <a>
      <a>
       <b/>
      </a>
      <b/>
    </a>
</topelement>

Где это недействительно:

<topelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.example.org/example" xsi:schemaLocation="http://www.example.org/example example.xsd">
    <a>
    <a>
      <b/>
    </a>
    <a/><!--this is wrong-->
    <b/>
    </a>
</topelement>


С уважением: Младенец про

3 голосов
/ 06 февраля 2010

Ошибка на втором a, а не на первом, a должен иметь выбор ниже.

1 голос
/ 06 февраля 2010

сработало ... Ошибка вводит в заблуждение, потому что она жалуется на неправильное 'a'.

Переименуйте верхний уровень 'a' в 'c', и он все еще жалуется на 'a' в строке 5.

Исправлено добавление minOccurs = 0 к элементу выбора, чтобы не всем элементам 'a' требовались дети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...