xsd验证模式问题

mrfwxfqh  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(424)

我必须在一个大的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>

下面是检查xml文件和xsd文件的java代码(我使用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只是一个扩展xmlfilterimpl的类,以避免检查xml文件的名称空间)
不幸的是,在xml文件中,有些URL带有字符“&#13;”表示回车:http://.yyy.zz/exampleofurl\包含无返回
当我使用包含此类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验证器解释了“&#13;”作为回车符,并在应用模式时导致此问题。
有没有办法强迫验证器不解释这个ascii码?
从我的观点来看,url是有效的,并且尊重模式。

ecbunoof

ecbunoof1#

您使用包含五个字符序列的字符串测试了regex & # 1 3 ; ,这是可以接受的,因为这五个字符中的每一个都与元字符“.”匹配。
但是在xml中,五个字符的序列 & # 1 3 ; 表示单个字符,代码点13。这是元字符“.”不匹配的两个字符之一(另一个是代码点10)。
你问“有没有办法强迫验证器不解释这个ascii代码?”答案是否定的。xsd验证总是对解析的xml进行操作,xml解析扩展了实体引用。

相关问题