3

我有一个 XSD 文件,用于验证客户端提交的 XML,他们可以提交的字段之一是xs:base64Binary类型,并且应该是 jpg 或 gif 图像。经常会提交不想要的类型(.PNG、.TGA、.PSD)或非常大(每个大于 10MB)的图像

我尝试过限制内容的长度,但是每次我尝试将元素的内容类型切换为complexContent并添加限制时,xsd 文件都无法通过验证,因为xs:base64Binary它是 simpletype

元素非常简单

<xs:element name="itemimage">
    <xs:annotation>
        <xs:documentation>Item picture in jpeg or gif format</xs:documentation>
    </xs:annotation>
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:base64Binary">
                <xs:attribute name="imgdescription" type="xs:string" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

`

是否可以根据图像的长度或通过将前几个字节与 base64 gif 或 jpeg 图像匹配的模式进行限制?

4

1 回答 1

3

正如您提到的那样,这是不可能的xs:restriction,但您可以使用xs:assert元素和 XPath 2.0 函数来做到这一点。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="itemimage">
    <xs:annotation>
      <xs:documentation>Item picture in jpeg or gif format</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:base64Binary">
          <xs:attribute name="imgdescription" type="xs:string" use="optional"/>
          <!-- Crudely check the base64 string length -->
          <xs:assert test="string-length(.) lt 2048"/>
          <!-- Matching on the start of a JPEG sequence -->
          <xs:assert test="matches(., '/9j/')"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

您的里程可能会因它的效果而异,但这是一个开始。

于 2013-06-07T23:43:07.617 回答