проверка схемы xsd

У меня проблема со схемой xsd. У меня определена следующая схема:

<xs:element name="nodes" type="nodesRootType" />

<xs:complexType name="nodesRootType">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
        <xs:element name="node" type="nodeType" />
    </xs:sequence>
</xs:complexType>

<xs:complexType name="nodeType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="node" type="nodeType" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>

и я тестирую его на следующем xml:

<label name="Label_6" >
    <label name="Label_7" />
</label>
<label name="Label_8" />

Ошибка, которую я получаю:

cvc-complex-type.2.4.a: Invalid content 
    was found starting with element 'node'. One of '{node}' is expected.

Что я здесь упускаю. Любая помощь высоко ценится.

Лучший, Йозеф


person Community    schedule 11.02.2009    source источник
comment
Возможно, вы захотите отредактировать свой вопрос, я не вижу ни схемы, ни XML.   -  person Joao da Silva    schedule 11.02.2009
comment
Я обновил свой ответ. Я могу правильно сериализовать XML нужной вам формы. Исправление состоит из двух частей: 1) перемещение maxOccurs и minOccurs в правильное место и 2) определение элемента отдельно в одном месте, чтобы он явно имел один и тот же тип в обоих местах схемы.   -  person Eddie    schedule 11.02.2009


Ответы (1)


Один XML-документ, который вы проверяете, не может иметь несколько корней. Он должен иметь один корень. Ваш XML:

<label name="Label_6">
    <label name="Label_7"/>
</label>
<label name="Label_8"/>

имеет два корня, потому что на корневом уровне есть два элемента "label". Кроме того, ваша схема не определяет ни одного элемента с именем «label», поэтому я запутался. Вероятно, вам нужна схема, которая будет проверять что-то вроде следующего XML:

<labels>
    <label name="Label_6">
        <label name="Label_7"/>
    </label>
    <label name="Label_8"/>
</labels>

где здесь у вас есть один корень "labels". Обратите внимание, что у вас есть элементы с одинаковым именем "label" на разных уровнях иерархии. Это не запрещено (см., например, xhtml, где вы можете иметь div внутри div внутри...), но это может сбивать с толку. Для примера XML, показанного выше, попробуйте что-то вроде схемы:

<xs:element name="labels">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="label" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:complexType name="labelType">
  <xs:sequence>
    <xs:element ref="label" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>

<xs:element name="label" type="labelType"/>
person Eddie    schedule 11.02.2009
comment
Да, я вырезал пример xml из контекста. Простите за это. Вы правы, я хочу проверить именно то, что вы написали. Вы сказали, что у меня нет элемента «метка» в схеме. Не могли бы вы привести пример схемы для xml, указанного выше? Большое спасибо. - person ; 11.02.2009
comment
Выдает такую ​​же ошибку. Испытаниями я обнаружил, что если я заменю ‹xs:element name=label type=labelType/› на ‹xs:element ref=label/› в рекурсивном определении сложного типа, это сработает... Я просто не знаю, почему это так.. . - person ; 11.02.2009
comment
Я нашел вашу проблему. У вас есть minOccurs и maxOccurs в неправильном месте. Проверьте мое редактирование выше. С этой схемой и образцом XML я могу правильно сериализовать и десериализовать. - person Eddie; 11.02.2009
comment
Привет, Эдди, могу я спросить тебя еще об одном? Можно ли проверить с помощью схемы некоторые уникальные ограничения? Допустим, я хочу, чтобы атрибут имени элемента метки имел уникальное имя, пересекающее весь xml. Является ли это возможным? Заранее спасибо. - person ; 12.02.2009
comment
@Jozef: Да, используйте xs:unique, чтобы требовать уникальности значений. Check out books.google.com/ - person Eddie; 13.02.2009
comment
@Jozef: Если вы пытаетесь заставить xs:unique работать и не можете, вы всегда можете создать новый вопрос (вместо того, чтобы просить помощи в комментариях). Это позволит людям создавать подробные ответы. - person Eddie; 13.02.2009