Проверка XML с помощью XML-считывателя на PHP
У меня возникли ошибки при проверке сгенерированной строки XML. Я загрузил XML-строку с помощью XML-считывателя и назначил XSD-файл для проверки.
Существуют идентификаторы объектов и URL-адреса для проверки на соответствие шаблону разрешенных символов. Я думаю, что идентификаторы и URL-адреса указаны правильно. Но почему процесс проверки приводит к ошибкам?
У меня есть такие сообщения об ошибках:
Element 'objectID': [facet 'pattern'] The value 'ffc89' is not accepted by the pattern '^[a-z]{1,1}[a-z0-9.-]{3,14}$'.
Element 'objectID': 'ffc89' is not a valid value of the local atomic type.
Element 'originUrl': [facet 'pattern'] The value 'http://domain.com/images/89/f972c66982290125.jpg' is not accepted by the pattern '^(http|https){1}(://){1}[a-zA-Z0-9\-\./#?&_]+'.
Element 'originUrl': 'http://domain.com/images/89/f972c66982290125.jpg' is not a valid value of the local atomic type.
Вот фрагмент кода:
$reader = new XMLReader();
// we enable user error handling
libxml_use_internal_errors(true);
// load xml sructure for testing against xsd
$reader->xml($xml_str_tocheck);
$reader->setSchema($xsd_file_name);
// read xml structure
while( $reader->read() ) ;
// close xml
$reader->close();
// get found xml errors
$errors = libxml_get_errors();
// we disable user error handling
// (Disabling will also clear any existing libxml errors.)
libxml_use_internal_errors(false);
// check if xml is not valid
if( count($errors) )
{
foreach ($errors as $error)
{
echo $error->message;
}
}
Это XML-строка для проверка:
<?xml version="1.0" encoding="UTF-8"?>
<oimages startFetchDate="2015-06-10T12:48:20+00:00">
<object>
<objectID>ffc89</objectID>
<images>
<image>
<originUrl>http://domain.com/images/89/f972c66982290125.jpg</originUrl>
</image>
</images>
</object>
</oimages>
Это XSD-файл:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="images">
<xs:complexType>
<xs:sequence>
<xs:element name="object" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="objectID" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="4"/>
<xs:maxLength value="15"/>
<xs:pattern value="^[a-z]{1,1}[a-z0-9.-]{3,14}$"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="images" maxOccurs="1" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="image" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="url" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="10"/>
<xs:pattern value="^(http|https){1}(://){1}[a-zA-Z0-9\-\./#?&_]+" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
4
1 answers
Ваш XML-файл недействителен по отношению к вашему XSD.
Внесите следующие изменения в свой XSD:
- Удалите дополнительный закрывающий тег для
xs:element
в строке 31. - Измените имя корневого элемента с
images
наoimages
. - Добавить атрибут
startFetchDate
вoimages
. - Удалите начальные
^
и конечные$
из^[a-z]{1,1}[a-z0-9.-]{3,14}$
поскольку регулярные выражения в XSD уже подразумеваются, чтобы начинаться и заканчиваться в начале и конце строка. - Удалите ведущую
^
из^(http|https){1}(://){1}[a-zA-Z0-9\-\./#?&_]+
.
После внесения вышеуказанных изменений в ваш XSD XML будет успешно проверен на соответствие XSD.
1
Author: kjhughes, 2015-06-11 12:24:43