我们在xsd中定义了以下简单类型:
<xsd:simpleType name="SimpleText255NotBlankType">
<xsd:annotation>
<xsd:documentation xml:lang="en">String of maximum 255 characters, not blank</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="255"/>
<xsd:pattern value=".*[^\s].*"/>
</xsd:restriction>
</xsd:simpleType>
问题是,当在输入xml中提供一个很长的字符串(大约1000000个字符)作为值时,我们认为由于长度原因,很快就认为它无效。实际上,自从正则表达式在maxLength限制之前进行评估以来,验证需要花费几分钟。
如果我们以这种方式定义simpleType,我们将找到解决该问题的方法:
<xsd:simpleType name="SimpleText255Type">
<xsd:annotation>
<xsd:documentation xml:lang="en">String of maximum 255 characters</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="255"/>
<xsd:pattern value=".{1,255}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="SimpleText255NotBlankType">
<xsd:annotation>
<xsd:documentation xml:lang="en">String of maximum 255 characters, not blank</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="SimpleText255Type">
<xsd:pattern value=".*[^\s].*"/>
</xsd:restriction>
</xsd:simpleType>
[该解决方法仅起作用,因为XSSimpleType的Xerces实现构建了regex模式的Vector,并且.{1,255}
模式将首先被评估,并且它相对较快地失败,因此将不检查耗时的第二个regex。]
有人遇到相同的问题并找到了解决方案,该解决方案不依赖于xsd验证的实现吗?还是有什么方法可以命令jaxb中的xsd:restriction-s验证(以便可以在检查模式之前验证maxLength)?
我们在github上创建了一个示例应用程序:https://github.com/petmaark/xsd-pattern-validation-test
我们在xsd中定义了以下简单类型:
<!-- https://mvnrepository.com/artifact/org.opengis.cite.xerces/xercesImpl-xsd11 -->
<dependency>
<groupId>org.opengis.cite.xerces</groupId>
<artifactId>xercesImpl-xsd11</artifactId>
<version>2.12-beta-r1667115</version>
</dependency>
<!--Needed for string-length -->
<!-- https://mvnrepository.com/artifact/com.ibm.icu/icu4j -->
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>4.6</version>
</dependency>