2010-03-15 7 views
5

Est-il possible d'utiliser XMLWriter de php pour insérer un nouveau noeud dans un fichier xml existant, puis enregistrer le fichier. Ce serait beaucoup plus utile pour moi que de créer un fichier enw chaque fois que je veux mettre à jour un fichier xml.PHP ajoute un noeud au fichier xml existant et enregistre

Répondre

2

Vous pouvez utiliser PHP de Simple XML. Vous devez lire le contenu du fichier, ajouter le noeud avec Simple XML et écrire le contenu.

7

J'utiliser simplexml à la place. Je sors d'un flanc et je suppose que si vous avez un écrivain XML, vous avez aussi simplexml.

Voyons voir, d'ajouter un nœud, supposons un très simple fichier xml (get it?):

<desserts> 
    <cakes> 
     <cake>chocolate</cake> 
     <cake>birthday</cake> 
    </cakes> 
    <pies> 
     <pie>apple</pie> 
     <pie>lemon</pie> 
    </pies> 
</desserts> 

Si cela est dans un fichier et que vous souhaitez ajouter une nouvelle tarte, vous faire:

$desserts = new SimpleXMLElement; 

$desserts->loadfile("desserts.xml"); 

$desserts->pies->addChild("pie","pecan"); 

Il peut être beaucoup plus sophistiqué que cela, bien sûr. Mais une fois que vous avez compris, c'est très utile.

0

Le problème général est ici qu'un document XML bien formé doit avoir qu'un seul élément racine. Cela signifie que vous devez lire/analyser dans l'arbre complet du document pour pouvoir ajouter un nouvel élément à l'intérieur. D'où toutes les suggestions simplexml ici.

XMLWriter est destiné à écrire un flux XML de données très efficace, mais ne peut pas modifier les fichiers existants (sans les lire en premier).

Voir ce fil sur perlmonks.com où les fichiers journaux XML sont discutés. Particulièrement intéressant est le commentaire de "mirod" qui montre comment avoir un fichier XML bien formé tout en étant capable d'ajouter des noeuds à un document. La solution consiste à placer les noeuds arbitraires dans un fichier séparé (qui n'est pas bien formé en soi à cause de l'élément racine déconnant) et à référencer le fichier en tant qu'entité externe. Dans votre cas, vous écririez le fichier qui sera inclus en tant qu'entité avec la fonction PHP fopen standard, ffrite fclose lors de l'ouverture du fichier à ajouter.

+0

ce que la plupart des parseurs XML comprennent/fichiers de référence de poignée assez bien compter sur cette solution? Et cette idée de nœuds liés n'étant pas validée est-elle une idée assez sûre et comprise? Je pourrais voir comment cela se passerait, si le navigateur/client/analyseur ne descend qu'en aval de la référence, mais est-ce qu'il y a une chance que ce soit pour protéger contre les références malformées dont il aura besoin pour valider tout le document? ou doit-il juste être valide dans le contexte du document xml primaire? – Anthony

+0

Je ne connais pas beaucoup d'analyseurs syntaxiques XML pour savoir si "la plupart" des analyseurs prennent en charge l'expansion d'entités. Je travaille principalement avec PHP et l'analyseur XML PHP (un wrapper autour de xmllib) le supporte. Après l'inclusion, le document complet doit être bien formé. Je vais modifier ma réponse pour refléter cela. – chiborg

-1
$xml_doc = new DomDocument; 

$xml_doc->Load('yourfilename.xml'); 

$desserts = $xml_doc->getElementsByTagName('desserts')->item(0); 

$burger =$xml_doc->createElement('burger'); 

$desserts->appendChild($burger); 

$done = $xml_doc->save("yourfilename.xml"); 

Cela fonctionne parfaitement bien. Et vous pouvez pouvez ajouter des attributs à l'hamburger aussi

Questions connexes