У нас есть следующий простой тип, определенный в нашем 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>
Обходной путь работает только потому, что реализация Xerces XSSimpleType создает вектор шаблонов регулярных выражений и.{1,255}
шаблон будет оценен первым, и он сравнительно быстро завершится неудачей, поэтому проверяющее много времени второе регулярное выражение не будет проверено.
Кто-нибудь сталкивался с той же проблемой и нашел решение, которое не зависит от реализациипроверка XSD? Или есть ли способ заказать проверку xsd: limitction-s в jaxb (чтобы maxLength можно было проверить перед проверкой шаблона)?
Мы создали пример приложения на github: https://github.com/petmaark/xsd-pattern-validation-test