У меня есть 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
Насколько я могу сказать, я сделал все, что я должен сделать, чтобы тег был завершен. Я заполнил его неограниченным выбором и теги 'b'. Кто-либо может видеть то, что пошло не так, как надо?
Для разъяснения я хочу там быть только одним тег под topelement, и под этим, соединением и теги 'b'.
Разобрались ... Ошибка вводит в заблуждение, потому что жалуется на неправильную букву «а».
Переименуйте верхний уровень 'a' в 'c', и он по-прежнему жалуется на 'a' в строке 5.
Исправление состоит в том, чтобы добавить minOccurs = 0 к элементу выбора, чтобы не все элементы 'a' нужны дети.
Ошибка находится на втором a
не на первом втором a
должен иметь выбор ниже.
Прежде чем отправить этот ответ, я не видел вашего собственного ответа... В любом случае, я не хочу, чтобы мои усилия/время потрачены впустую... Поэтому я не буду удалять это сообщение... Наряду с тем же ответом я также... написал несколько баллов, пожалуйста, пройдитесь...
ComplexType aType
определяет, что он всегда имеет либо , либо
в качестве дочерних элементов ... Это означает ... где бы ни появлялся элемент
, он должен иметь дочерний элемент
или
... что не является истиной ... согласно вашему входному 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>
Таким образом, согласно моему коду ... Тэг может иметь или не иметь никаких дочерних элементов.
Если вы не хотите изменять XSD файл ... то ваш XML должен иметь тэг или
тэг как дочерний от
...
что-то вроде этого :
<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>
Where as this is invalid:
<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>
regards:
Младенец-профессионал