Precedente :: Successivo |
Autore |
Messaggio |
sevenjeak Semidio


Registrato: 04/02/08 22:05 Messaggi: 308 Residenza: Roma
|
Inviato: 05 Set 2009 13:18 Oggetto: [PHP/XML] Lettura con la classe DOM |
|
|
:edit by freemind - ho rimosso il riferimento al 3d che avevi aperto nell'altra sezione perchè l'ho rimosso. Grazie per esserti autocorretto!:
Ho creato oggi uno script che legge da un file xml, il codice è questo:
Codice: |
<?php
error_reporting(E_ALL);
$dom = new DOMdocument('1.0');
$dom->load('Database/software.xml');
$root = $dom->getElementsByTagName('software');
foreach ($root as $rs) {
// Estrago il valore del nodo <name>
$nome = $rs->getElementsByTagName('name');
$nome = $nome->item(0)->nodeValue;
echo $nome."<br /><br />";
// Estrago il valore del nodo <desc>
$desc = $rs->getElementsByTagName('desc');
$desc = $desc->item(0)->nodeValue;
echo $desc."<br /><br />";
// Estrago il valore del nodo <os>
$os = $rs->getElementsByTagName('os');
$os = $os->item(0)->nodeValue;
echo $os."<br /><br />";
// Estrago il valore del nodo <dim>
$dim = $rs->getElementsByTagName('dim');
$dim = $dim->item(0)->nodeValue;
echo $dim."<br /><br />-------<br />";
}
?>
|
Il codice funziona, ma se c'è più di un nodo <software> mi restituisce questo errore:
Warning: DOMDocument::load() [domdocument.load]: Extra content at the end of the document in /membri/sevenjeak/under/Database/software.xml, line: 11 in /membri/sevenjeak/under/software.php on line 4 |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 05 Set 2009 15:25 Oggetto: |
|
|
Ciao, da quello che ho capito tu stai cercando di leggere un file xml che ha una struttura nella forma:
Codice: |
<software>
....
....
</software>
<software>
....
....
</software>
|
Il file in questione non va bene perchè un documento xml DEVE avere un solo nodo root e il nodo root è quello di primo livello.
Il tuo script funziona se hai solo un nodo software perchè questo viene interpretato appunto come nodo root; fuori da quello non può esistere nulla altrimenti ti ritrovi l'errore che hai riportato.
Prova ad usare un file tipo:
Codice: |
<root>
<software>
....
....
</software>
<software>
....
....
</software>
</root>
|
e dopo aver caricato il documento con il metodo DOMDocument::load() come fai già recuperi il nodo root. Per farlo usa ad esempio:
Codice: |
$xml=new DOMDocument('1.0','UTF-8');
$xml->load('test.xml');
$xmlRoot=$xml->documentElement;
|
A questo punto per ciclare dentro i nodi <software> farai una roba tipo:
Codice: |
$nodes=$xmlRoot->getElementsByTagName('software');
foreach ($nodes as $n)
{
...
}
|
Ho scritto due righe di codice al volo che ti propongo qui:
Codice: |
<?php
$xml=new DOMDocument('1.0','UTF-8');
$xml->load('test.xml');
$xmlRoot=$xml->documentElement;
$nodes=$xmlRoot->getElementsByTagName('software');
foreach ($nodes as $n)
{
print 'id: ' . $n->getElementsByTagName('id')->item(0)->nodeValue.'<br/>';
print 'nome: ' . $n->getElementsByTagName('nome')->item(0)->nodeValue.'<br/>';
print '---<br/>';
}
?>
|
su un file xml che si chiama text.xml:
Codice: |
<?xml version="1.0" encoding="UTF-8"?>
<root>
<software>
<id>1</id>
<nome>uno</nome>
</software>
<software>
<id>2</id>
<nome>due</nome>
</software>
</root>
|
Scusa se non ho usato i nomi che hai usato tu ma non avendo il tuo xml ne ho fatto uno scemo al volo giusto per farti vedere il meccanismo.
ciao ciao |
|
Top |
|
 |
sevenjeak Semidio


Registrato: 04/02/08 22:05 Messaggi: 308 Residenza: Roma
|
Inviato: 05 Set 2009 16:42 Oggetto: |
|
|
Ho mezzo le modifiche cha hai fatto, mi restituisce questi errori:
Notice: Undefined variable: dom in /membri/sevenjeak/under/software.php on line 4
Fatal error: Call to a member function load() on a non-object in /membri/sevenjeak/under/software.php on line 4 |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 05 Set 2009 18:43 Oggetto: |
|
|
Ehm... io la variabile $dom non la uso, il codice che ho scritto andava adattato al tuo... non è che mi posti quello che hai fatto dopo le poche righe che ti ho postato?
Grazie |
|
Top |
|
 |
sevenjeak Semidio


Registrato: 04/02/08 22:05 Messaggi: 308 Residenza: Roma
|
Inviato: 05 Set 2009 19:09 Oggetto: |
|
|
Il codice che ora ho è questo:
Codice: |
<?php
error_reporting(E_ALL);
$xml=new DOMDocument('1.0', 'UTF-8');
$dom->load('Database/software.xml');
$root= $xml->documentElement;
$nodes = $root->getElementsByTagName('software');
foreach ($nodes as $rs) {
// Estrago il valore del nodo <name>
$nome = $rs->getElementsByTagName('name');
$nome = $nome->item(0)->nodeValue;
echo $nome."<br /><br />";
// Estrago il valore del nodo <desc>
$desc = $rs->getElementsByTagName('desc');
$desc = $desc->item(0)->nodeValue;
echo $desc."<br /><br />";
// Estrago il valore del nodo <os>
$os = $rs->getElementsByTagName('os');
$os = $os->item(0)->nodeValue;
echo $os."<br /><br />";
// Estrago il valore del nodo <dim>
$dim = $rs->getElementsByTagName('dim');
$dim = $dim->item(0)->nodeValue;
echo $dim."<br /><br />-------<br />";
}
?>
|
|
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 09 Set 2009 22:31 Oggetto: |
|
|
Devi decidere se usare $dom o $xml come variabile per contenere il documento xml.
Codice: |
...
$xml=new DOMDocument('1.0', 'UTF-8');
$dom->load('Database/software.xml');
$root= $xml->documentElement;
...
|
Le tre righe sopra sono quelle che hai scritto tu.
Crei una var che si chiama $xml e la usi come documento xml ma poi chiami $dom (che non esiste) per caricare il file.
Poi di nuovo usi $xml come se contenesse il file.
Quindi o nella seconda riga scrivi:
Codice: |
$xml->load('Database/software.xml');
|
oppure porti tutto a $dom.
Dopo di che non mi pare che tu usi più ne $xml ne $dom quindi il resto potrebbe essere ok |
|
Top |
|
 |
|