Чтобы обратиться к локальному DTD при использовании PHP SimpleXML, мне нужно преобразовать абсолютный путь в URI типа файла. Например, преобразуйте /home/sitename/www/xml/example.dtd в файл: ///home/sitename/www/xml/example.dtd.
.
В приведенном примере это достаточно просто, поскольку все, что требуется, это добавить схему 'file' перед путем. Но если возникает ситуация, например, наличие пробела в одном из имен каталогов, этого недостаточно. Механизм должен работать в 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.