XSD 包含回车 return (&#13) 时的模式验证问题

XSD validation issue with pattern when containing carriage return (&#13)

我必须检查大型 XML 文件中 URL 的有效性。

我必须使用此模式来检查 URL 是否有效:

<xs:simpleType name="url">
    <xs:restriction base="xs:string">
         <xs:pattern value="https?://([^/:]+\.[a-zA-Z]{2,10}|([0-9]{1,3}\.){3}[0-9]{1,3})(:[0-9]+)?((/|\?).*)?"/>
    </xs:restriction>
  </xs:simpleType>

这里是 java 代码,用于检查 XML 文件与 XSD 文件(我使用库 javax.xml.*):

Validator validator = xmlSchema.newValidator();
        
SAXSource sourceXML = new SAXSource(
        new NamespaceFilter(XMLReaderFactory.createXMLReader()),
        new InputSource(new FileInputStream(new File(pathXmlFile)))
    );
        
validator.validate(sourceXML, null);

(注意:NamespaceFilter 只是 class 扩展 XMLFilterImpl 以避免检查 XML 文件的命名空间)

不幸的是,在 XML 文件中,有一些 URL 带有字符“ ”代表马车return: http://xxx.yyy.zz/exampleofurl\ 包含烦人的马车return

当我 运行 我的代码使用包含这种 URL 的 XML 文件时,我收到此错误:

org.xml.sax.SAXParseException; lineNumber: 238719; columnNumber: 129; cvc-pattern-valid: Value 'http://xxx.yyy.zz/exampleofurl
containinganannoyingcarriagereturn' is not facet-valid with respect to pattern 'https?://([^/:]+\.[a-zA-Z]{2,10}|([0-9]{1,3}\.){3}[0-9]{1,3})(:[0-9]+)?((/|\?).*)?' for type 'url'.

XSD 验证器似乎解释了“ ”作为马车 return 并在应用模式时导致此问题。

有没有办法强制验证器不解释这个 ASCII 码?

从我的角度来看,URL 是有效的并且尊重模式。

您使用包含五个字符序列 & # 1 3 ; 的字符串测试了正则表达式,该字符串被接受,因为这五个字符中的每一个都与元字符“.”相匹配。

但在 XML 中,五个字符序列 & # 1 3 ; 表示单个字符,代码点 13。这是元字符“.”的两个字符之一。不匹配(另一个是代码点 10)。

你问“有没有办法强制验证器不解释这个 ASCII 码?”答案是否定的。 XSD 验证始终对已解析的 XML 进行操作,并且 XML 解析会扩展实体引用。