【问题标题】:XSD required element within xs:choicexs:choice 中的 XSD 必需元素
【发布时间】:2014-03-12 15:33:28
【问题描述】:

我在构建一个模式时遇到了麻烦,该模式将验证顺序的必需元素,然后是随机排序的可选元素。

这个 XML sn-p 是一个例子:

<?xml version="1.0" encoding="UTF-8" ?>
<messageExample>
  <oprionalField1>3</oprionalField1>
  <requiredField1>1234</requiredField1>
  <requiredField2>WHA_12345678</requiredField2>
  <oprionalField2/>
</messageExample>

以及它的 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="messageExample">
    <xs:complexType>
      <xs:sequence>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="oprionalField1" minOccurs="0" type="xs:int" default="0" />
          <xs:element name="requiredField1" minOccurs="1">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:minLength value="1"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
          <xs:element name="requiredField2" minOccurs="1">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:minLength value="1"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
          <xs:element name="oprionalField2" type="xs:string" minOccurs="0" />
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我需要使用&lt;xs:choice&gt;,因为默认情况下,模式会按模式中列出的顺序等待消息节点。

当我传递空的requredField1 like: &lt;requiredField1&gt;&lt;/requiredField&gt; 时,一切正常:它在验证期间抛出异常。但是,如果跳过此字段(未显示 &lt;requiredField1&gt; 标记),则不会引发异常。

我该如何解决这种情况?如果缺少参数,我想有一个异常。

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    解决方案是使用&lt;xs:all&gt; 而不是&lt;xs:choise&gt;。它对我来说很好。 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="messageExample">
        <xs:complexType>
          <xs:all>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="oprionalField1" minOccurs="0" type="xs:int" default="0" />
              <xs:element name="requiredField1" minOccurs="1">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="requiredField2" minOccurs="1">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="oprionalField2" type="xs:string" minOccurs="0" />
            </xs:all>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    【讨论】:

    • 这不是格式正确的。您的 &lt;xs:choice&gt; 标签未关闭。 xs:sequence 的结束标记从未打开,如果它应该关闭&lt;xs:choice&gt;,则它位于文档的错误级别。无论如何,选择不是对所有人都有效的孩子!这是不可能的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多