【问题标题】:Complex XML validation with XSD使用 XSD 进行复杂的 XML 验证
【发布时间】:2011-02-21 03:20:49
【问题描述】:

假设我有以下 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>

【问题讨论】:

  • 您是说您的 XML 不应该验证,因为该问题只有一个答案吗?如果是这样,您的架构已经这样做了。 (使用此架构时,您的 XML 无效。)
  • 你是正确的 DevNull,当前的模式就是这样做的。但是我必须更新模式以通过所有 n 个可能的答案选择都是正确答案的情况。现在,当 中仅指定一个答案且没有其他位置时,更新后的架构不起作用。

标签: .net xml xsd xml-validation


【解决方案1】:

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,而answers 序列中没有列出“不正确”的answer 元素,那么您就没有了运气。您不能使用 XML 模式进行这种类型的验证。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 2014-03-27
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-10-30
    • 2013-10-25
    相关资源
    最近更新 更多