使用正则表达式的LibXML2日期验证错误

问题描述:

对使用​​正则表达式的模式验证XML时遇到问题。我正在使用LibXML。实际上PHP使用libXML,但当然,在控制台中也会出现同样的问题。 XML应该是有效的,因为我使用一些在线验证器进行了测试。使用正则表达式的LibXML2日期验证错误

反正变通办法?修改架构不是一个很好的选择,因为它是由第三方提供的。

我在libXML 2.7.8和2.9.1版本中使用xmllint命令。

xmllint: using libxml version 20708 
    compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib 

xmllint: using libxml version 20901 
    compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib 

命令我使用:

xmllint --noout -schema s x 

错误,我得到:

命名
x:2: element testdate: Schemas validity error : Element 'testdate': [facet 'pattern'] The value '31.8.2013' is not accepted by the pattern '((([0-2]{0,1}[0-9]{1})|(3[0,1]{1}))\.((0?[1-9]{1})|(1[0-2]{1}))\.2[0-9]{3})?'. 
x:2: element testdate: Schemas validity error : Element 'testdate': '31.8.2013' is not a valid value of the atomic type 'mdatetype'. 
x fails to validate 

我的XML文件中的 'x' 是:

<?xml version="1.0" encoding="UTF-8"?> 
<testdate>31.8.2013</testdate> 

我命名为 'S' 模式是:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="testdate" type="mdatetype"/> 
    <xs:simpleType name="mdatetype"> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="10"/> 
      <xs:pattern value="((([0-2]{0,1}[0-9]{1})|(3[0,1]{1}))\.((0?[1-9]{1})|(1[0-2]{1}))\.2[0-9]{3})?"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

编辑

一些正则表达式的工作。我与芬兰sosial安全号码

模式

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <xs:element name="x" /> 
     <xs:element name="testdate" type="mdatetype" /> 
     <xs:element name="testhetu" type="mhetu" /> 
     <xs:simpleType name="mdatetype"> 
       <xs:restriction base="xs:string"> 
         <xs:pattern value="((([0-2]{0,1}[0-9]{1})|(3[0,1]{1}))\.((0?[1-9]{1})|(1[0-2]{1}))\.2[0-9]{3})?"/> 
       </xs:restriction> 
     </xs:simpleType> 
     <xs:simpleType name="mhetu"> 
       <xs:restriction base="xs:string"> 
         <xs:pattern value="((([0-2]{1}[0-9]{1})|(3[0,1]{1}))((0[0-9]{1})|(1[0-2]{1}))[0-9]{2}[\+\-aA]{1}[0-9]{3}[0-9A-Fa-fHhJ-Nj-nPpR-Yr-y]{1})?"/> 
       </xs:restriction> 
     </xs:simpleType> 
</xs:schema> 

XML

<x> 
<testhetu>151182-152x</testhetu> 
<testhetu>151182A154G</testhetu> 
</x> 

* 结果(仅适用于最新的SSN是无效的,由于g是不允许的)测试*

x:3: element testhetu: Schemas validity error : Element 'testhetu': [facet 'pattern'] The value '151182A154G' is not accepted by the pattern '((([0-2]{1}[0-9]{1})|(3[0,1]{1}))((0[0-9]{1})|(1[0-2]{1}))[0-9]{2}[\+\-aA]{1}[0-9]{3}[0-9A-Fa-fHhJ-Nj-nPpR-Yr-y]{1})?'. 
x:3: element testhetu: Schemas validity error : Element 'testhetu': '151182A154G' is not a valid value of the atomic type 'mhetu'. 
x fails to validate 

欢迎任何帮助!

看起来像libxml不能理解重复计数中0到1的符号,可以简单地用questionmark替换。

所以你在第一个架构模式应该是:

((([0-2]?[0-9]{1})|(3[0,1]{1}))\.((0?[1-9]{1})|(1[0-2]{1}))\.2[0-9]{3})? 

或者更好的是你可以简化它归结为:

((([0-2]?[0-9])|(3[0,1]))\.((0?[1-9])|(1[0-2]))\.2[0-9]{3})? 

这是因为你并不需要明确地说,这个字符重复1次,因为重复一次是默认的。

+0

这是真的,但在这种情况下更改架构不是一个好主意。但我会这样做,直到找到另一个解决方案。那些只是最小化的示例模式。 libxml中有错误吗? – iiro