如果定义了maxLength和pattern限制,则对于长字符串验证XML的速度很慢

问题描述 投票:1回答:1

我们在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中定义了以下简单类型:[[[String ...

java xsd xml-parsing jaxb xsd-validation
1个回答
0
投票
Xerces2支持XSD 1.1。不幸的是,该版本不在官方的Maven中央存储库中。您可以使用第三方存储库(您还将需要icu4j)。如果这不是可行的解决方案,则可以从Xerces website(Xerces2 Java 2.12.0(XML Schema 1.1))下载官方的稳定版本,并将其安装到本地maven存储库中。

<!-- 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>

© www.soinside.com 2019 - 2024. All rights reserved.