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 — Remplace les XIncludes dans un objet DOMDocument
Description
Cette méthode remplace les » XIncludes dans un objet DOMDocument.
Note:
Vu que la bibliothèque libxml2 résout automatiquement les entités, cette méthode peut produire des résultats non attendus si le fichier XML inclus a une DTD d'attachée.
Valeurs de retour
Retourne le nombre de XIncludes du document, -1 si une erreur survient
lors du processus, ou FALSE s'il n'y a aucune substitution.
Exemples
Exemple #1 Exemple avec DOMDocument::xinclude()
<?php
$xml = <<<EOD
<?xml version="1.0" ?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Les livres d'une autre personne</title>
<para>
<xi:include href="book.xml">
<xi:fallback>
<error>xinclude: book.xml n'a pas été trouvé</error>
</xi:fallback>
</xi:include>
</para>
</chapter>
EOD;
$dom = new DOMDocument;
// Nous voulons un joli affichage
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
// chargement de la chaîne XML définie ci-dessus
$dom->loadXML($xml);
// remplacement des xincludes
$dom->xinclude();
echo $dom->saveXML();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
<?xml version="1.0"?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Les livres d'une autre personne</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
11-Jul-2007 10:56
