У меня есть XSD (XML Schema), который содержит несколько файлов. В корне системы есть каталог.xml, который является каталогом XML. Он содержит определения каталога SYSTEM и URI, которые необходимы для правильной обработки файлов xsd.
Теперь мой вопрос: как я могу проверить xml против этих схем в php? Если я просто использую DOMDocument-> Schemavalidate () и даю ему правильный xsd, определения каталога не будут разрешены, а php выдает ошибку, подобную этой:
Warning: DOMDocument::schemaValidate(): I/O warning : failed to load external entity "urn:oasis:names:tc:dita:xsd:highlightDomain.xsd:1.2"
Это в файле catalog.xml, как разрешить это выражение, но я не смог найти способ справиться с этим с помощью php.
DOM использует libxml внизу. LibXML должен иметь возможность использовать файлы Каталога, когда они помещаются в /etc/xml/catalog
. Такой же путь на окнах IIRC.
Не стесняйтесь повышать свой запрос функции, чтобы сделать путь, настраиваемый с PHP:
Проблема, с которой вы сталкиваетесь, заключается в том, что PHP не может решить следующий путь:
urn:oasis:names:tc:dita:xsd:highlightDomain.xsd:1.2
в вашей системе.
Вы могли бы заменить экземпляры таких URI тем, что PHP может решить.
Одна вещь, которая приходит мне на ум, – это зарегистрировать обертку потока, которая автоматически разрешает эти URI.
В качестве альтернативного решения вы можете самостоятельно прочитать файлы XSD и преобразовать их в URI DATA, а затем заменить старый URI urn:
URI новым URI данных. Пример кода:
$name = 'file.xsd'; $path = '/path-to-file/'.$name; $data = file_get_contents($path); $file = 'data://text/plain;base64,'.base64_encode($data);
Надеюсь это поможет.