2010-03-15 19 views
5

È possibile utilizzare XMLWriter di php per inserire un nuovo nodo in un file xml esistente e quindi salvare il file. Questo sarebbe molto più utile per me creare effettivamente un file enw ogni volta che voglio aggiornare un file xml.PHP aggiunge nodo al file xml esistente e salva

risposta

2

È possibile utilizzare PHP Simple XML. Devi leggere il contenuto del file, aggiungere il nodo con Simple XML e scrivere di nuovo il contenuto.

7

Vorrei utilizzare simplexml invece. Sto uscendo su un arto e partendo dal presupposto che se hai uno scrittore XML hai pure simplexml.

Vediamo, per aggiungere un nodo, supponiamo che un semplice file XML (get it?):

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

Se questo è in un file, e si desidera aggiungere una nuova torta, si sarebbe fare:

$desserts = new SimpleXMLElement; 

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

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

Può essere molto più sofisticato di questo, naturalmente. Ma una volta capito, è molto utile.

0

Il problema generale qui è che un documento XML ben formato deve avere un solo elemento radice. Ciò significa che devi leggere/analizzare l'albero del documento completo per poter aggiungere un nuovo elemento all'interno. Quindi tutti i suggerimenti di simplexml qui.

XMLWriter è pensato per scrivere un flusso XML di dati in modo molto efficiente, ma non può modificare i file esistenti (senza leggerli prima).

Vedere questa discussione su perlmonks.com dove vengono discussi i file di registro XML. Particolarmente interessante è il commento di "mirod" che mostra come avere un file XML ben formato ed essere ancora in grado di aggiungere nodi a un documento. La soluzione è posizionare i nodi arbitrari in un file separato (che non è ben formato da solo a causa dell'elemento radice di messing) e fare riferimento al file come entità esterna. Nel tuo caso, scriveresti il ​​file che verrà incluso come entità con la funzione PHP standard fopen, fwrite fclose durante l'apertura del file per l'aggiunta.

+0

La maggior parte dei parser XML capisce/gestisce i file di riferimento abbastanza bene da basarsi su questa soluzione? E questa idea di nodi collegati non viene convalidata un'idea abbastanza sicura e comprensibile? Potrei vedere come sarebbe, se il browser/client/parser va solo a valle del riferimento, ma c'è qualche possibilità che per proteggersi da riferimenti malformati debba prima convalidare l'intero documento? o ha solo bisogno di essere valido nel contesto del documento xml primario? – Anthony

+0

Non conosco molti parser XML per sapere se i parser "più" supportano l'espansione dell'entità. Io lavoro principalmente con PHP e il parser XML PHP (un wrapper su xmllib) lo supporta. Dopo l'inclusione, il documento completo deve essere ben formato. Modificherò la mia risposta per riflettere questo. – 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"); 

Questo lavoro perfettamente. E puoi anche aggiungere attributi al burger

Problemi correlati