XSD 包含回车 return (
) 时的模式验证问题
XSD validation issue with pattern when containing carriage return (
)
我必须检查大型 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 解析会扩展实体引用。