Чтобы сослаться на локальный DTD при использовании PHP SimpleXML, мне нужно преобразовать абсолютный путь в URI типа файла. Например, преобразуйте /home/sitename/www/xml/example.dtd в файл:///home/sitename/www/xml/example.dtd.
В приведенном примере это достаточно просто, так как все, что требуется, это добавить схему «файл» перед путем. Но если возникает ситуация, когда в одном из имен каталогов есть пробел, этого недостаточно. Этот механизм должен работать в Windows или Linux и разрешать использование символов, отличных от ASCII, в именах каталогов.
Код, разработанный до сих пор:
$absparts = explode('/', _ALIRO_ABSOLUTE_PATH);
$driveletter = (0 == strncasecmp(PHP_OS, 'win', 3)) ? array_shift($absparts) : '';
$filename = $driveletter.implode('/', array_map('rawurlencode', $absparts)).'/xml/'.$filename.'.dtd';
$href = 'file:///'.$filename;
где определенный символ — это абсолютный путь к корню системы (всегда с косой чертой), DTD находится в подкаталоге xml и имеет имя $filename, за которым следует расширение .dtd.
Будет ли это работать корректно? Есть ли лучший подход?
Позвольте мне объяснить немного больше фона. Цель состоит в том, чтобы проанализировать XML-документ с помощью SimpleXML. Это делается с помощью функции simplexml_load_string() с параметром LIBXML_DTDVALID. XML-документ будет содержать реальный URI, указывающий на домашний веб-сайт, но я не хочу вводить задержки, связанные с доступом к удаленному веб-сайту, или загружать домашний веб-сайт запросами. Поэтому ссылка на DTD редактируется так, чтобы ссылаться на локальный компьютер. Но он должен быть встроен как URI в DOCTYPE внутри XML-документа. Ограничения не являются моим выбором, они подразумеваются в правилах для DOCTYPE и применяются функцией SimpleXML. Я могу определить, где находится файл, как абсолютный путь, но чтобы поместить его в DOCTYPE, его нужно преобразовать в URI.