PHP - ошибка проверки схемы XSD с регулярным выражением Unicode - PullRequest
3 голосов
/ 17 января 2012

Описание:

Когда я пытаюсь проверить XML-файл с заданной схемой XSD, содержащей обычный Юникод В выражении функция 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 ]

1 голос
/ 17 января 2012

Схема хороша, ваш процессор схемы содержит ошибку или несоответствие. На самом деле, для процессоров схем вполне обычно реализовывать диалекты регулярных выражений, несколько отличающиеся от диалектов, определенных в спецификации XSD: ленивые разработчики просто передают регулярное выражение в выбранную ими библиотеку.

1 голос
/ 17 января 2012

Это не полный ответ на ваш вопрос, но, возможно, некоторые пояснения:

Регулярные выражения в XSD, даже если они могут быть похожи на выражения с preg_match, - это другое.Поэтому предположить, что что-то должно работать с XSD, потому что оно работает с preg_match, - это предположение, но не строгий тест.

Категория Документы Буквы в нижнем регистре со своим свойством Ll определяется Unicode, библиотека XSD должна его поддерживать.

Возможно, это проблема с негативомкатегория, потому что она говорит только то, что нет, но не то, что в классе неотрицательных символов.

Попробуйте:

[^\p{Ll}]+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...