Leggere xml con dom in php

intimoviro

Utente Attivo
18 Ago 2009
272
0
0
Salve ragazzi, ho questo file, leggo tutti i nodi, però non ho il risultato sperato con un nodo in particolare. Ecco il codice xml:

Codice:
<Products>
    <Product>
      <InternalID>13</InternalID>
      <ManageWarehouse>true</ManageWarehouse>
      <Notes>reggiseno,reggiseni,balconcino,aris</Notes>
      <ImageFileName>0013-01 (13).jpg</ImageFileName>
      <Variant>
        <Size>1</Size>
        <Color>BIANCO</Color>
      </Variant>
      <Variant>
        <Size>2</Size>
        <Color>BIANCO</Color>
      </Variant>
      <Variant>
        <Size>3</Size>
        <Color>BIANCO</Color>
      </Variant>
    </Product>

In php Dom:
PHP:
$xml=new DOMDocument('1.0','UTF-8');
   $xml->load('articoli.xml');
   
   $xmlRoot=$xml->documentElement;
   
   $cicle1=$xmlRoot->getAttribute('Mode');

   $nodes=$xmlRoot->getElementsByTagName('Product'); 
   $variant=$xmlRoot->getElementsByTagName('Variant'); 

foreach($variant as $v) {
      $qv['products_options_values_name'] = $v->getElementsByTagName('Size')->item(0)->nodeValue;
....

In $variant leggo il contenuto del tag Variant, però devo inserire nel database il contenuto del tag InternalId e tutti i contenuti del tag variant associati al prodotto.

Ora riesco a recapitare tutti i valori, però quando eseguo la query per inserire i record associati ai prodotti nel database, m'inserisce l'id del primo prodotto e poi tutti i contenuti del tag variant, cioè se all'articolo 1 è associato bianco e nero, e nell'articolo 2 è associato verde e blu, nell'associazione nel database m'inserisca "l'articolo1 con bianco, nero, verde, e blu".
Spero di essere stato abbastanza chiaro nel descrivere il mio problema, visto che è complicato anche ad esternarlo.

Grazie
 
La parte di codice che non funziona è questa:
PHP:
foreach($variant as $v) {
      $qv['products_options_values_name'] = $v->getElementsByTagName('Size')->item(0)->nodeValue;
...
Se hai diversi elementi Size, perché recuperi sempre il primo? Prova così:
PHP:
$count = 0;
foreach($variant as $v) {
      $qv['products_options_values_name'] = $v->getElementsByTagName('Size')->item($count)->nodeValue;
      $count++;
...
 
Così neanche mi riesce, in base al codice xml che ho postato sopra,
(partenda dall'inizio) come posso fare in modo di prelevare il codice, la taglia e il colore associati ad ogni prodotto ed inserirli nel database?

Grazie
 
Con un codice tipo questo:
PHP:
<?php
// apre il file XML
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('articoli.xml');

// recupera l'elemento base
$xmlRoot = $xml->documentElement;

// recupera tutti i prodotti
$products = $xmlRoot->getElementsByTagName('Product');

// inizializza un array
$data = array();

// cicla tutti i prodotti
for($i = 0; $i < count($products); $i++)
{
	// recupera l'oggetto DOM del prodotto
	$product = $products->item($i);

	// crea un nuovo array
	$data[$i] = array();

	// recupera le varianti del prodotto
	$variants = $product->getElementsByTagName('Variant');

	// cicla tutte le varianti
	for($x = 0; $x < count($variants); $x++)
	{
		// recupera l'oggetto DOM della variante
		$variant = $variants->item($x);

		// inizializza l'array della variante
		$data[$i][$x] = array();

		// salva nell'array i nuovi dati
		$data[$i][$x]['Size'] = $variant->getElementsByTagName('Size')->item(0)->nodeValue;
		$data[$i][$x]['Color'] = $variant->getElementsByTagName('Color')->item(0)->nodeValue;
	}
}

// visualizza le informazioni
var_dump($data);
?>
Prendendo come esempio il file XML sopra riportato, questo script restituisce:
Codice:
array(1) {
  [0]=>
  array(1) {
    [0]=>
    array(2) {
      ["Size"]=>
      string(1) "1"
      ["Color"]=>
      string(6) "BIANCO"
    }
  }
}
Non capisco però perché non mostra le altre varianti...
 
Ultima modifica:

Discussioni simili