PHP + XML aggiungere nodo

Salve a tutti , sto cercando di modificare/aggiungere nodi in un file xml attraverso le funzioni php.

Questo è il codice xml

<?xml version="1.0" encoding="UTF-8" ?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
    <title>Sample XSPF Playlist</title>   
</playlist>

In questo caso vorrei aggiungere un altro tag <title> con un valore diverso.

Dopo essermi letto e riletto la documentazione di php.net con tanto di esempi non sono ancora riuscito a venirne a capo.

Come prima soluzione ho fatto un get_elements_by_tagname del tag title e subito dopo un append_child. L'output che mi da è spostare(invece che copiare) il tag title alla fine di tutto. Ecco il codice:

<?php

if (!$dom =domxml_open_file("e:\easyphp1-8\www\under\player\playlist2.xml")) {
  echo "Error while parsing the document\n";
  exit;
}


$elements = $dom->get_elements_by_tagname("title");
$element = $elements[0];

 $dom->append_child($element);


echo "<pre>";
$xmlfile = $dom->dump_mem();
echo htmlentities($xmlfile);
echo "</pre>";
?>

Poi ho provato  ad usare clone_node e set_content per modificare il contenuto del tag

$elements = $dom->get_elements_by_tagname("title");
$element = $elements[0];
$temp = $element->clone_node(true);
$temp->set_content("Nuovo contenuto");
$dom->append_child($temp);

però come output mi esce

<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" version="1">
    <title>Sample XSPF Playlist</title>   
</playlist>
<title xmlns="http://xspf.org/ns/0/">Sample XSPF PlaylistNuovo contenuto</title>

non capisco perchè nel tag title mi setta l'attributo xmlns="http://xspf.org/ns/0/" di playlist e inoltre come posso modificare il contentuto del nuovo tag title ? come vedete ho provato set_content ma invece di piazzare il contenuto nuovo  me lo concatena con il vecchio contenuto.

Spero che mi potrete aiutare, conto su di voi  O0

Saluti

Giuseppe

inviato 10 anni fa
Toto007
X 0 X

Stai usando delle versioni obsolete delle funzioni DOM.

Devi fare così:

<?php
// crea il nuovo oggetto DOMDocument
$dom = new DOMDocument();

// carica nel DOMDocument il contenuto del file XML
$dom->loadXML(file_get_contents("playlist.xml"));

// recupera un oggetto DOMElementsList che contiene tutti gli elementi con nome "title"
$elements = $dom->getElementsByTagName("title");

// recupera il primo elemento del DOMElementsList
$element = $elements->item(0);

// cambia il valore del nodo
$element->nodeValue = 'Ciccio';


echo "<pre>";
$xmlfile = $dom->saveXML();
echo htmlentities($xmlfile);
echo "</pre>";
?>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Mi da errore

Warning: domdocument() expects at least 1 parameter, 0 given in e:\easyphp1-8\www\undertheory.com\player\player3.php on line 5

Fatal error: Call to undefined function: loadxml() in e:\easyphp1-8\www\undertheory.com\player\player3.php on line 6

Eppure tengo caricate le librerie

extension=php_domxml.dll

extension=php_xmlrpc.dll

anche se sulla doc dice che non è necessario installare nulla e come versione php ho la PHP Version 4.3.10

risposto 10 anni fa
Toto007
X 0 X

Ho provato a mettere

$dom = new DomDocument( 
    '<?xml version="1.0" encoding="utf-8"?><playlist/>' 
);

sono riuscito a bypassare il primo errore però poi mi dice Call to undefined function: loadxml()

poi ho provato ad eseguire un esempio che c'era nella documentazione

$dom = new DOMDocument('1.0', 'iso-8859-1');

ma mi da questo altro errore

Warning: domdocument() expects parameter 2 to be long, string given in e:\easyphp1-8\www\undertheory.com\player\player3.php on line 3
risposto 10 anni fa
Toto007
modificato 10 anni fa
X 0 X

Che versione di PHP stai usando?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

l'ho scritto nel quote di prima "ho la PHP Version 4.3.10"

risposto 10 anni fa
Toto007
X 0 X

http://www.zend.com/php5/articles/php5-xmlphp.php#Heading8

leggendo qui da quello che ho capito i comandi che mi hai dato valgono dalla versione 5.0...

non cè qualche soluzione per implementare utilizzarlo cmq con la versione precedente ?

Ho trovato questo link a riguardo: http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/

ma mi da errore il codice all'intero dell'include.

risposto 10 anni fa
Toto007
X 0 X

come non detto il link di prima si riferisce leggendo meglio che usando php 5 si possono usare le vecchi versioni che erano presenti in php4

risposto 10 anni fa
Toto007
X 0 X

RESOCONTO:

leggendo meglio la documentazione della vecchia versione dom

http://it.php.net/manual/it/ref.domxml.php

"Nota: Questo modulo non è più considerato sperimentale. Tuttavia non sarà rilasciato con PHP 5, e sarà solo distribuito con PHP 4. Se si ha bisogno del supporto DOM XML in PHP 5, si può utilizzare il modulo DOM. Questa estensione domxml non è compatibile con DOM. "

Quindi in php 4 non esiste l'estensione DOM  che è di php 5 e quindi bisogna usare l'estensione DOM XML.

alla fine cmq sono riuscito a fare quello che volevo... usando ovviamente la versione per php4.

if($dom=domxml_open_file('e:\easyphp1-8\www\undertheory.com\player\playlist2.xml'))
{
$root=$dom->document_element();
$elements=$root->get_elements_by_tagname('title');
$element=$elements[0];

$title=$dom->create_element('title');
$title->append_child($dom->create_text_node('Caparezza - Toto007 sei bono'));
$root->append_child($title);
$root->append_child($dom->create_text_node("\n"));

echo "<pre>";
$xmlfile = $dom->dump_mem();
echo htmlentities($xmlfile);
echo "</pre>";

OUTPUT:

<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" version="1">
    <title>Sample XSPF Playlist</title>   
<title>Caparezza - Toto007 sei bono</title>
</playlist>

Cmq Gianni se sai qualcosa fammi sapere :)

saluti

Giuseppe

risposto 10 anni fa
Toto007
X 0 X

Temevo fosse un problema di versioni PHP, comunque l'importante è che hai risolto.

 :bye:

P.S.: ma la variabile $element a cosa ti serve visto che poi non la usi?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

E'  un avanzo di un codice non c'entra nulla con questo script :P

risposto 10 anni fa
Toto007
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda