templates XML simples comme ceux-ci:DOMDocument :: loadXML() pour des parties de XML
structure.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<document>
<book>first book</book>
<book>second book</book>
((other_books))
</document>
book_element.xml:
<book>((name))</book>
Et ce test:
<?php
Header("Content-type: text/xml; charset=UTF-8");
class XMLTemplate extends DOMDocument
{
private $_content_storage;
private $_filepath;
private $_tags;
public function XMLTemplate($sFilePath)
{
if(!file_exists($sFilePath)) throw new Exception("file not found");
$this->_filepath = $sFilePath;
$this->_tags = [];
$this->_content_storage = file_get_contents($this->_filepath);
}
public function Get()
{
$this->merge();
$this->loadXML($this->_content_storage);
return $this->saveXML();
}
public function SetTag($sTagName, $sReplacement)
{
$this->_tags[ $sTagName ] = $sReplacement;
}
private function merge()
{
foreach($this->_tags as $k=>$v)
{
$this->_content_storage = preg_replace(
"/\({2}". $k ."\){2}/i",
$v,
$this->_content_storage
);
}
$this->_content_storage = preg_replace(
"/\({2}[a-z0-9_\-]+\){2}/i",
"",
$this->_content_storage
);
}
}
$aBooks = [
"troisième livre",
"quatrième livre"
];
$Books = "";
foreach($aBooks as $bookName)
{
$XMLBook = new XMLTemplate("book_element.xml");
$XMLBook->SetTag("name", $bookName);
$Books .= $XMLBook->Get();
}
$XMLTemplate = new XMLTemplate("test.xml");
$XMLTemplate->SetTag("other_books", $Books);
echo $XMLTemplate->Get();
?>
Donnez-moi une erreur ou:
Attention: DOMDocument :: loadXML(): déclaration XML autorisée seulement au début du document dans l'entité, la ligne: 5
Comme méthode loadXML() ajouter automatiquement la déclaration à la contenu, mais j'ai besoin d'injecter des parties de xml dans le modèle final comme ci-dessus. Comment désactiver cet ajout automatique ennuyeux et laissez-moi utiliser ma déclaration? Ou une autre idée pour résumer le problème?