Сложная проверка XML с помощью XSD - PullRequest
0 голосов
/ 21 февраля 2011

Предположим, у меня есть следующий XML, как мне обновить мою схему XSD (также описанную ниже), чтобы предотвратить ее проверку?

По сути, вопрос № 3 выглядит как вопрос с единственным выбором, поскольку в теге есть только один ответ.Но тогда внутри тега должен быть хотя бы один тег, в противном случае нет другого доступного для выбора вопроса, кроме правильного.

<?xml version="1.0" encoding="utf-8" ?>
<quiz>
  <question><!-- single choice question -->
    <text>Question 1</text>
    <answers>
      <answer>Answer 1</answer>
      <answer>Answer 2</answer>
      <answer>Answer 4</answer>
      <correct>
        <answer>Answer 3</answer>
      </correct>
    </answers>
  </question>
  <question><!-- multiple choice question -->
    <text>Question 2</text>
    <answers>
      <answer>Answer 1</answer>
      <answer>Answer 3</answer>
      <correct>
        <answer>Answer 2</answer>
        <answer>Answer 4</answer>
      </correct>
    </answers>
  </question>
  <question><!-- doesn't make sense. help me prevent this validation -->
    <text>Question 3</text>
    <answers>
      <correct>
        <answer>Some answer</answer>
      </correct>
    </answers>
  </question>
  <question><!-- all answers are correct -->
    <text>Question 4</text>
    <answers>
      <correct>
        <answer>Answer 1</answer>
        <answer>Answer 2</answer>
        <answer>Answer 3</answer>
        <answer>Answer 4</answer>
      </correct>
    </answers>
  </question>
</quiz>

Вот XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="quiz">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="question">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="text" type="xs:string" />
              <xs:element name="answers">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="0" maxOccurs="unbounded" 
                     name="answer" type="xs:string" />
                    <xs:element name="correct" minOccurs="1" maxOccurs="1">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element maxOccurs="unbounded" name="answer"
                           type="xs:string" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

1 Ответ

1 голос
/ 21 февраля 2011

Определение элемента answer (\question\answers\answer) должно иметь minOccurs = 1. У вас изначально было это:

<xs:element minOccurs="0" maxOccurs="unbounded" name="answer" type="xs:string" />

Измените его на это, и вы получите подтверждение, которое вы 'ищите:

<xs:element minOccurs="1" maxOccurs="unbounded" name="answer" type="xs:string" />

Однако, если вы хотите проверить, что последовательность correct содержит более одного answer в списке, когда в списке нет "неправильных" answer элементов.answers последовательность - вам не повезло.Этот тип проверки нельзя выполнить с помощью схем XML.

...