针对使用正则表达式的架构验证 XML 时遇到问题。我正在使用 LibXML。实际上 PHP 使用了 libXML,但同样的问题当然出现在控制台中。XML 应该是有效的,因为我使用一些在线验证器对其进行了测试。
无论如何解决方法?修改架构不是一个很好的选择,因为它是由第三方来源提供的。
我将 xmllint 命令与 libXML 版本 2.7.8 和 2.9.1 一起使用。
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
我的名为“x”的 XML 文件是:
<?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>
编辑
一些正则表达式有效。我用芬兰社会安全号码进行了测试
架构
<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
欢迎任何帮助!