2013-03-20 4 views
1

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?

Répondre

1

Si vous n'aimez pas l'erreur et que vous souhaitez enregistrer le document que vous souhaitez fusionner sans la déclaration XML, enregistrez simplement l'élément document au lieu du document entier.

Voir les deux variantes dans l'exemple de code suivant (online-demo):

$doc = new DOMDocument(); 
$doc->loadXML('<root><child/></root>'); 

echo "The whole doc:\n\n"; 
echo $doc->saveXML(); 

echo "\n\nThe root element only:\n\n"; 
echo $doc->saveXML($doc->documentElement); 

La sortie est comme suit:

The whole doc: 

<?xml version="1.0"?> 
<root><child/></root> 


The root element only: 

<root><child/></root> 

Cela devrait probablement être déjà utile pour vous. De plus, il existe une constante pour libxml qui peut être utilisée pour contrôler si la déclaration XML est sortie ou non. Mais je ne l'utilisais:

LIBXML_NOXMLDECL (entier)

déposer la déclaration XML lors de l'enregistrement d'un document

Note: Uniquement disponible en Libxml> = 2.6.21

De:http://php.net/libxml.constants

Voir le lien pour les options supplémentaires, vous pourriez vouloir utiliser l'un ou l'autre dans le futur.

Questions connexes