If you use the loadXML() method instead of the load() one (let's say, to process the XML string before loading and parsing it), you will have problems with xinclude(), because the parser will not know where to find the files to include.
Using chdir() before xinclude() will not help.
The solution is to set the documentURI property of the DOMDocument object accordingly to it's original filename, and everything will work fine !
<?php
$xml = file_get_contents($file);
$xml = do_something_with($xml);
$doc = new DOMDocument;
$doc->documentURI = $file;
$doc->loadXML($xml);
$doc->xinclude();
?>
DOMDocument::xinclude
(PHP 5)
DOMDocument::xinclude — Проводит вставку XInclude разделов в объектах DOMDocument
Описание
int DOMDocument::xinclude
([ int
$options
] )Этот метод вставляет » XInclude блоки в объекте класса DOMDocument.
Замечание:
Вследствие того, что libxml2 автоматически разрешает сущности, вызов этого метода приведет к неожидаемым результатам в случае, когда XML файл содержит прикрепленную схему DTD.
Возвращаемые значения
Возвращает количество блоков XInclude в документе, -1 если при обработке
произошла ошибка, либо FALSE, если не было произведено ни одной замены.
Примеры
Пример #1 Пример использования DOMDocument::xinclude()
<?php
$xml = <<<EOD
<?xml version="1.0" ?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Books of the other guy..</title>
<para>
<xi:include href="book.xml">
<xi:fallback>
<error>xinclude: book.xml not found</error>
</xi:fallback>
</xi:include>
</para>
</chapter>
EOD;
$dom = new DOMDocument;
// Оформим вывод красиво
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
// загрузка XML строки, определенной выше
$dom->loadXML($xml);
// вставка блока xinclude
$dom->xinclude();
echo $dom->saveXML();
?>
Результатом выполнения данного примера будет что-то подобное:
<?xml version="1.0"?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Books of the other guy..</title>
<para>
<row xml:base="/home/didou/book.xml">
<entry>The Grapes of Wrath</entry>
<entry>John Steinbeck</entry>
<entry>en</entry>
<entry>0140186409</entry>
</row>
<row xml:base="/home/didou/book.xml">
<entry>The Pearl</entry>
<entry>John Steinbeck</entry>
<entry>en</entry>
<entry>014017737X</entry>
</row>
<row xml:base="/home/didou/book.xml">
<entry>Samarcande</entry>
<entry>Amine Maalouf</entry>
<entry>fr</entry>
<entry>2253051209</entry>
</row>
</para>
</chapter>
nicolas_rainardNOSPAM at yahoo dot fr ¶
5 years ago
