PHP - 使用unicode正则表达式的XSD架构验证错误

时间:2012-01-17 08:50:24

标签: php xml validation xsd schema

说明

当我尝试使用包含Unicode常规的给定XSD架构验证XML文件时 表达式,函数DOMDocument :: schemaValidate返回验证错误。 XSD架构是W3C格式良好,验证通过另一个 验证工具。 如果XSD模式是这样的格式(没有正方形),则不会出现此问题 括号中):

<xsd:pattern value="\P{Ll}+"/>

PHP版本:5.2.14
LibXml版本:2.7.7

上一个模式[\P{Ll}]+可以与preg_match函数一起使用。


测试脚本:

PHP验证码:

function libxml_display_errors()
{
   $errors = libxml_get_errors();

   print_r($errors);

   libxml_clear_errors();
}

libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->load('test.xml');

if ( !$dom->schemaValidate('test.xsd') ) {
  echo "XML Error\n";
  libxml_display_errors();
} else {
  echo "XML ok\n";
}

XSD架构:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xsd:simpleType name="noLowerCase">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[\P{Ll}]+"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="DatiUtenteType">
        <xsd:sequence>
            <xsd:element name="Cognome" type="noLowerCase"/>
            <xsd:element name="Nome" type="noLowerCase"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="DataExchangeFisso">
        <xsd:sequence>
            <xsd:element name="DatiUtente" type="DatiUtenteType"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="ListOfDataExchange">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="DataExchangeFisso" type="DataExchangeFisso" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<ListOfDataExchange>
  <DataExchangeFisso>
    <DatiUtente>
      <Cognome>FOO</Cognome>
      <Nome>BAR</Nome>
    </DatiUtente>
  </DataExchangeFisso>
</ListOfDataExchange>

预期结果:

XML ok

实际结果:

XML Error
Array
(
    [0] => LibXMLError Object
        (
            [level] => 2
            [code] => 1839
            [column] => 0
            [message] => Element 'Cognome': [facet 'pattern'] The value 'FOO' is not accepted by the pattern '[\P{Ll}]+'.
            [file] => /var/www/html/test.xml
            [line] => 5
        )

    [1] => LibXMLError Object
        (
            [level] => 2
            [code] => 1824
            [column] => 0
            [message] => Element 'Cognome': 'FOO' is not a valid value of the atomic type 'noLowerCase'.
            [file] => /var/www/html/test.xml
            [line] => 5
        )

    [2] => LibXMLError Object
        (
            [level] => 2
            [code] => 1839
            [column] => 0
            [message] => Element 'Nome': [facet 'pattern'] The value 'BAR' is not accepted by the pattern '[\P{Ll}]+'.
            [file] => /var/www/html/test.xml
            [line] => 6
        )

    [3] => LibXMLError Object
        (
            [level] => 2
            [code] => 1824
            [column] => 0
            [message] => Element 'Nome': 'BAR' is not a valid value of the atomic type 'noLowerCase'.
            [file] => /var/www/html/test.xml
            [line] => 6
        )
)

2 个答案:

答案 0 :(得分:1)

这不是你问题的完整答案,但可能有一些澄清:

XSD中的正则表达式,即使它可能与preg_match的正则表达式相似,也是另一回事。因此,假设某些内容必须与XSD一起使用,因为它与preg_match一起使用是猜测,但不是严格的测试。

categoryDocs 字母小写,其属性Ll由Unicode定义,XSD库应该支持它。< / p>

这个类别的消极性可能是一个问题,因为它只说了什么不是,而不是非负面的角色类。

尝试:

[^\p{Ll}]+

答案 1 :(得分:1)

架构很好,架构处理器有错误或不符合。对于模式处理器来说,实现正则表达式方言与XSD规范中定义的方言略有不同并不罕见:懒惰的实现者只是将正则表达式直接传递给他们选择的库。

相关问题