我必须在一个大的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带有字符“
;”表示回车: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验证器解释了“
;”作为回车符,并在应用模式时导致此问题。
有没有办法强迫验证器不解释这个ascii码?
从我的观点来看,url是有效的,并且尊重模式。
1条答案
按热度按时间ecbunoof1#
您使用包含五个字符序列的字符串测试了regex
& # 1 3 ;
,这是可以接受的,因为这五个字符中的每一个都与元字符“.”匹配。但是在xml中,五个字符的序列
& # 1 3 ;
表示单个字符,代码点13。这是元字符“.”不匹配的两个字符之一(另一个是代码点10)。你问“有没有办法强迫验证器不解释这个ascii代码?”答案是否定的。xsd验证总是对解析的xml进行操作,xml解析扩展了实体引用。