У меня есть подпрограмма, которая сохраняет фрагменты XML как отдельные документы.Имя файла генерируется из одного из элементов, который может содержать символов, которые нежелательны в имени файла - например, пробел или /
.Чтобы обойти это, я urlencode()
сначала имя файла, поэтому вместо:
ABC DEF/123.xml
я получаю:
ABC+DEF%2F123.xml
Это прекрасно работает, если речь идет о файловой системе, но дляпо какой-то причине DOMDocument::load
и DOMDocument::save
оба декодируют %2F
и интерпретируют его как литерал /
.
. Это достаточно легко воспроизвести:
$filename = urlencode('ABC DEF/123.xml');
$dom = new DOMDocument();
$dom->save($filename);
PHPПредупреждение: DOMDocument :: save (ABC + DEF / 123.xml): не удалось открыть поток: нет такого файла или каталога в коде оболочки php в строке 1
Для простого обходного пути я делаю это:
file_put_contents($filename, $dom->saveXml());
Мой вопрос: почему эти методы ведут себя так?И есть ли свойство, которое я могу установить, или какой-то другой способ заставить эти методы работать, чтобы я мог использовать методы DOMDocument вместо file_put_contents()
или тому подобное?
ОБНОВЛЕНИЕ: Просмотр php source похоже, что обработка файла делегирована xmlSaveFormatFileEnc()
, которая называется " Дамп XML-документа в файл или URL ."Предположительно, этому файлу дается имя файла, так как это может быть и фактический URL.Это все еще оставляет мне много вопросов.Буду признателен за то, что кто-то хорошо разбирается в C
или знаком с libxml2
, чтобы прокомментировать дальше или дать реальный ответ о том, что здесь происходит.