Я проверяю документ SVG (который, как я считаю, действителен) против спецификации SVG. Я использую XMLReader в PHP и предпочитаю придерживаться этого, поскольку я буду использовать XMLReader в другом месте; что если есть другие читатели, основанные на потоках, которые сделают это легче / лучше, позвольте мне знать.
Хорошо, вот какой код:
// Set some values for the purpose of this example $this->path = '/Users/jon/Development/Personal/Visualised/master/test-assets/import-png.svg'; $xsdPath = '/Users/jon/Development/Personal/Visualised/master/test-assets/xsd/SVG.xsd'; $reader = new XMLReader(); $reader->open($this->path); $valid = $reader->setSchema($xsdPath); $reader->close();
Хорошо, поэтому файлы XSD, которые у меня есть в моей папке xsd
:
Кажется, что парсер импортирует второй и третий XSD с первого – я хочу, чтобы любые зависимости хранились на диске, а не извлекались из Интернета.
ОК, вот результат:
XMLReader::setSchema(): Element '{http://www.w3.org/2001/XMLSchema}import': Skipping import of schema located at '/Users/jon/Development/Personal/Visualised/master/test-assets/xsd/xml.xsd' for the namespace 'http://www.w3.org/XML/1998/namespace', since this namespace was already imported with the schema located at 'http://www.w3.org/2001/xml.xsd'. in /Users/jon/Development/Personal/Visualised/master/lib/Visualised/Document.php on line 45 Warning: XMLReader::setSchema(): Element '{http://www.w3.org/2001/XMLSchema}attribute': The attribute 'type' is not allowed. in /Users/jon/Development/Personal/Visualised/master/lib/Visualised/Document.php on line 45 Warning: XMLReader::setSchema(): Element '{http://www.w3.org/2001/XMLSchema}attribute': The attribute 'type' is not allowed. in /Users/jon/Development/Personal/Visualised/master/lib/Visualised/Document.php on line 45 Warning: XMLReader::setSchema(): Element '{http://www.w3.org/2001/XMLSchema}attribute': The attribute 'type' is not allowed. in /Users/jon/Development/Personal/Visualised/master/lib/Visualised/Document.php on line 45 Warning: XMLReader::setSchema(): Unable to set schema. This must be set prior to reading or schema contains errors. in /Users/jon/Development/Personal/Visualised/master/lib/Visualised/Document.php on line 45
Похоже, что я где-то импортировал неправильную версию схемы – я нашел все документы XSD только через веб-поиск. Есть идеи?
Изменить: последняя ошибка предполагает, что схема должна быть установлена перед чтением документа. ОК, поэтому я изменил код на это:
$reader = new XMLReader(); $valid = $reader->setSchema($xsdPath); $reader->open($this->path); $reader->close();
– некоторые из первых предупреждений идут, но я все еще получаю Unable to set schema
.
Файл XSD для SVG, на который вы ссылаетесь, относится к старой рабочей версии SVG 1.1. В настоящее время официально нет поддерживаемой схемы XML для SVG 1.1. Более подробную информацию см. В этом ответе .