首页 > 解决方案 > 如何制作应该只验证mandaotry字段的通用xsd

问题描述

我想写一个 xsd,它只通过必填字段的验证。

我在 xsd 下面写了 xml。

<Order OrderNo="12345" OrgCode="US">
    <OrderLines>
        <OrderLine OrderLineNo="1" OrderLineKey="1" />
        <OrderLine OrderLineNo="2" OrderLineKey="2" />
    </OrderLines>
</Order>

在上面的 xml OrderNo、OrgCode、OrderLineNo、OrderLineKey 是必填字段。

我在 xsd 下面写了上面的 xml。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="OrderLines">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="OrderLine" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute type="xs:byte" name="OrderLineNo" use="required"/>
                      <xs:attribute type="xs:byte" name="OrderLineKey" use="required"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute type="xs:short" name="OrderNo" use="required"/>
      <xs:attribute type="xs:string" name="OrgCode" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

现在我希望下面的 xml 来验证上面的 xsd,它有一些可选的附加属性。如下:

<Order OrderNo="12345" OrgCode="US" Email="ab@gmail.com">
    <OrderLines>
        <OrderLine OrderLineNo="1" OrderLineKey="1"  Qty="2"/>
    </OrderLines>
</Order>

我希望我的 xsd 以允许任意数量的可选属性(电子邮件、数量和任何非强制性属性)和元素的方式编写。即使它们没有在 xsd 中定义。

标签: xmlxsdxsd-validation

解决方案


You can use xs:any element in the place you want to be able to add the unspecified elements to, and xs:anyAttribute element in the place where you want the additional attributes.

To make your example validate, you would need to change it to

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="OrderLines">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="OrderLine" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute type="xs:byte" name="OrderLineNo" use="required"/>
                      <xs:attribute type="xs:byte" name="OrderLineKey" use="required"/>
                      <xs:anyAttribute/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute type="xs:short" name="OrderNo" use="required"/>
      <xs:attribute type="xs:string" name="OrgCode" use="required"/>
      <xs:anyAttribute/>
    </xs:complexType>
  </xs:element>
</xs:schema>

推荐阅读