Валидация xml по xsd

AlvarCrash

Новичок
Здравствуйте!
Есть надобность проверить xml файл на соответствие схеме. Вроде все просто:

$file = 'D:\PHP\407p\XSD\RFM_044555567_20160325_001.xml';
$schema = 'D:\PHP\407p\XSD\RequestSchema.xsd';
$ab = new DOMDocument;
$ab->load($file);

if ($ab->Schemavalidate($schema)) {
print "$file is valid.\n";
} else {
print "$file is invalid.\n";
}

НО!

Выпадает куча ошибок:
Warning: DOMDocument::schemaValidate(): failed to compile: expecting a branch after | in D:\PHP\407p\test.php on line 7

Warning: DOMDocument::schemaValidate(): Element '{http://www.w3.org/2001/XMLSchema}pattern': The value '(0|\-?[1-9][0-9]*)|' of the facet 'pattern' is not a valid regular expression. in D:\PHP\407p\test.php on line 7

Warning: DOMDocument::schemaValidate(): failed to compile: expecting a branch after | in D:\PHP\407p\test.php on line 7

Warning: DOMDocument::schemaValidate(): Element '{http://www.w3.org/2001/XMLSchema}pattern': The value '\-?(0?|[1-9][0-9]*)\.[0-9]+|' of the facet 'pattern' is not a valid regular expression. in D:\PHP\407p\test.php on line 7

Warning: DOMDocument::schemaValidate(): failed to compile: expecting a branch after | in D:\PHP\407p\test.php on line 7

Warning: DOMDocument::schemaValidate(): Element '{http://www.w3.org/2001/XMLSchema}pattern': The value '(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/([1-9]\d{3})|' of the facet 'pattern' is not a valid regular expression. in D:\PHP\407p\test.php on line 7

Нутром чую, что косяк в самой схеме - что-то не нравиться, но проблема в том, что схема не моя, как и сам xml - и изменению не подлежат =( А валидацию провести надо... Ткните носом пожалуйста, где тут косяк? Спасибо!
 

Вложения

  • 6,8 KB Просмотры: 6

WMix

герр M:)ller
Партнер клуба
Есть такая штука saxon, ну те ты в праве выбитать язык, но мне ближе названное, остальное сам.
 

AlvarCrash

Новичок
Предлагаете делать валидацию процессором XSLT, я правильно понял? Я не против, просто, это сути вопроса не меняет - почему валидация-то не проходит...
 

AlvarCrash

Новичок
сайт будет просматриваться на машинках, на которых установка java не предусмотрена. А так-то я против нее особо ничего не имею.

Но опять же повторюсь - я уже перепробовал несколько стандартных и сторонних решений для валидации xml по схеме - все дают одну и ту же ошибку.
 

AnrDaemon

Продвинутый новичок
При чём тут то, на каких машинах будет просматриваться сайт?
Вы вообще что за бред сейчас написали?
 

AlvarCrash

Новичок
К делу не относится, но тем не менее:
Разве Saxon не использует Java? По крайней мере валидация из командной строки использует в явном виде - тут выше ссылочка была на документацию, потрудитесь ознакомиться.
И как я писал ранее, установка Java машины не возможна в силу тех или иных причин, не важно каких.

А если вы потрудитесь прочитать начальное сообщение, то поймете, что вопрос не про использование Java или Saxon, а немного о другом. Так вот если по существу посоветовать ничего не можете, давайте тогда форум засорять не будем. Спасибо
 

AnrDaemon

Продвинутый новичок
Вопрос сейчас стоит в первую очередь о том, понимаете ли вы вообще в принципе суть своего собственного вопроса.
Или, говоря казённым языком, в состоянии ли вы корректно отделить проблемную область?
Какое вообще отношение клиенты имеют к валидации?

P.S.
И, да, вашу проблему я понял ещё с первого сообщения - она типична, и называется "мне было лень погуглить".
 

WMix

герр M:)ller
Партнер клуба
Я понимаю что использование иной технологии, чаще нежелательное усложнение, но в данном случае мы говорим про интерпретер байткода на серверной стороне, который очень легко вырезается в микросервис в изолированном контейнере. Задача столь наивная, что даже существует готовая команда ссылку на которую я привел
 

AlvarCrash

Новичок
@AnrDaemon, клиенты к валидации отношения не имеют никакого. Я не верно истолковал предложение @WMix (в последнем посте его на это указано).
Заметьте я не спрашиваю как сделать валидация - на php.net все доходчиво расписано. Что касается гугления, то все указывает на неверно составленное регулярное выражение в схеме. Это все понятно, читать умею с детства, НО! Проблема в том,что схема выложена в источнике, и ей пользуются и она рабочая. Вот тут просто поверьте мне на слово. И я не понимаю в чем дело... если схема корректна, то почему не идёт валидация, если схема не корректна, как это проходит у других...

Я попробовал не один метод валидации, через DOMDocument, через XMLReader, через класса сторонних разработчиков. Через Саксон не пробовал, но постораюсь, хотя думаю результат будет тот же.
 

WMix

герр M:)ller
Партнер клуба
если схема корректна, то почему не идёт валидация
Я кстати и об этом думал и о том что схема схеме рознь, они могут быть и по смыслу и по версии разные. Саксоном просто проверяется, чаще он поддерживает все известное
 

AnrDaemon

Продвинутый новичок
Потому что схема корректна, но 90% парсеров некорректно интерпретируется.
Самое простое решение - preg-replace('#\|"#', '|()"', $схема).
 

AmdY

Пью пиво
Команда форума
Странная ситуация, попробуй проверить через XMLSpy, очень давно не возился со схемами, буду делать предположения.
Возможно какая-нибудь проблема с версией php или библиотеки для xml. какие они у тебя?
Здесь доки по схемам https://www.w3.org/TR/xmlschema-0/
 

AmdY

Пью пиво
Команда форума
Ржать будешь… схема создана в XMLSpy.
не буду, я посмотрел прежде чем давать советы, видел XMLSpy и 2014, потому и прошу провалидировать xmlку в той же программе и проверить актуальность библиотек, там же ещё гребанная кирилица и бом символ в xml-ке.
 
  • Like
Реакции: WMix

WMix

герр M:)ller
Партнер клуба
кирилица не должна быть проблемой, с бомом не знаю, но парсер ломается на регулярных выражениях
и мне эти регулярки тоже не очень понятны

Код:
<xs:restriction base="xs:string">
    <xs:pattern value="(0|\-?[1-9][0-9]*)"/>
</xs:restriction>
The value '(0|\-?[1-9][0-9]*)|' of the facet 'pattern' is not a valid regular expression.
в этом квантинайзера не хватает
 

AlvarCrash

Новичок
Спасибо, за советы! Самое интересное, что вчера валидация получилась на домашнем компе (правда поздно ночью). Окрыленный успехом попытался повторить на рабочем компе... Но, блин не перенес нужный файл с кодом, а повторить не могу сейчас =) Грешным делом думаю, не приснилось ли вчера это =)) Короче надо валить домой пораньше и смотреть.

Кстати, валидация по XMLSpy проходит - проверил сразу.

И действительно буду проверять версионность php - есть подозрения, что она разная на моих компах, поэтому дома проходит, на работе нет.
 

AlvarCrash

Новичок
В общем косяк с версией PHP - валидация проходит корректно при версии PHP 5.4 и apache 2.2.

Однако решение, но имхо не самое лучшее... Буду копать дальше
 
Сверху