Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Split di xml in files più piccoli

    Ciao a tutti,
    scusate la domanda forse banale, ma su internet ho trovato ben poco.

    Mi servirebbe creare uno script, che dato un certo file xml di dimensioni elevate, così strutturato

    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <intestazione>
    <prodotti>
    <prodotto>
    <campo1>
    <campo2>
    </campo2>
    </campo1>
    </prodotto>
    <prodotto>
    <campo1>
    <campo2>
    </campo2>
    </campo1>
    </prodotto>
    </prodotti>
    </intestazione>
    mi costruisse diversi file xml più piccoli (salvandoli) strutturati così:
    file1.xml
    codice:
    <intestazione>
    <prodotti>
    <prodotto>
    <campo1>
    <campo2>
    </campo2>
    </campo1>
    </prodotto>
    </prodotti>
    </intestazione>
    quindi diciamo un file xml per prodotto, mantenendo però la struttura dell'xml.
    Dite che è fattibile?
    Grazie mille a chi vorrà aiutarmi

  2. #2
    se cerchi sul forum un paio di settimane fa c'era uno che aveva il tuo stesso problema, potresti provare a cercare....

    ma perchè vuoi splittarlo il file?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Ciao Santino83_02,
    intanto grazie per la risposta.
    Googlando avevo trovato la tua risposta, e cercando tra i tuoi post avevo anche trovato quello di 12 giorni prima dove elencavi alcuni link che avevo già letto. Il vero problema è che ho trovato codice "illeggibile", o meglio, nessun tutorial che mi spieghi almeno a grandi linee.
    Ti spiego anche perché devo creare questi xml: ho un xml da parsare con Domit! di circa 30 mega, ed essendo uno script che non ho creato io, sono obbligato a restare con Domit!; il problema è che questo parser ha una gestione della memoria paurosa, e con un xml da 12 mega non mi bastano 800 mega di ram sul mio vps.
    L'unica soluzione è quindi spezzettarlo in file più piccoli e parsarli di volta in volta.

    Grazie

  4. #4
    Dato che non posso modificare il mio messaggio, posto il codice che ho prodotto finora:
    Codice PHP:
    <?php 

    $xml
    simplexml_load_file('articoli.xml');
    $i=0;
    foreach (
    $xml->UpdatedProducts->Product as $product) {
        
    $id[$i]= $product->InternalID;
        
    $code[$i] = $product->Code;
        
    $descr[$i]= $product->Description;
        
    $descrhtml[$i]= $product->DescriptionHtml;
        
    $cat[$i]= $product->Category;
        
    $subcat[$i]= $product->Subcategory;
        
    $vat[$i]= $product->Vat;
        
    $um[$i]= $product->Um;
        
    $uno[$i]= $product->NetPrice1;
        
    $unoa[$i]= $product->GrossPrice1;
        
    $due[$i]= $product->NetPrice2;
        
    $duea[$i]= $product->GrossPrice2;
        
    $cinque[$i]= $product->NetPrice5;
        
    $cinquea[$i]= $product->GrossPrice5;
        
    $sette[$i]= $product->NetPrice7;
        
    $settea[$i]= $product->GrossPrice7;
        
    $otto[$i]= $product->NetPrice8;
        
    $ottoa[$i]= $product->GrossPrice8;
        
    $producer[$i]= $product->ProducerName;
        
    $suppcode[$i]= $product->SupplierCode;
        
    $suppname[$i]= $product->SupplierName;
        
    $suppprodcode[$i]= $product->SupplierProductCode;
        
    $suppnetprice[$i]= $product->SupplierNetPrice;
        
    $suppgrossprice[$i]= $product->SupplierGrossPrice;
        
    $sizeum[$i]= $product->SizeUm;
        
    $weightum[$i]= $product->WeightUm;
        
    $netweight[$i]= $product->NetWeight;
        
    $grossweight[$i]= $product->GrossWeight;
        
    $manage[$i]= $product->ManageWarehouse;
        
    $qty[$i]= $product->AvailableQty;
        
    $notes[$i]= $product->Notes;
        
    $image[$i]= $product->ImageFileName;
        
    $i++;
        
        
    }
    for (
    $x=0$x<$i$x++){
        
    $myFile "split[$x].xml";
    $fh fopen($myFile'w') or die("can't open file");
    $stringData '<?xml version="1.0" encoding="UTF-8"?>';
    fwrite($fh$stringData);
    $stringData "\n";
    fwrite($fh$stringData);
    $stringData '<EasyfattProducts AppVersion="2" Creator="Danea Easyfatt Enterprise  2011.16c" CreatorUrl="http://www.danea.it/software/easyfatt" Mode="incremental" ImageFolder="\">';
    fwrite($fh$stringData);
    $stringData "\n";
    fwrite($fh$stringData);
    $stringData '  <UpdatedProducts>';
    fwrite($fh$stringData);
    $stringData "\n";
    fwrite($fh$stringData);
    $stringData '<Product>';
    fwrite($fh$stringData);
    $stringData "\n";
    fwrite($fh$stringData);
    $stringData "<InternalID>$id[$x]</InternalID>";
    fwrite($fh$stringData);
    $stringData "\n";
    fwrite($fh$stringData);
    $stringData '</Product>';
    fwrite($fh$stringData);
    $stringData "\n";
    fwrite($fh$stringData);
    $stringData '  </UpdatedProducts>';
    fwrite($fh$stringData);
    $stringData '<DeletedProducts></DeletedProducts>';
    fwrite($fh$stringData);
    $stringData '</EasyfattProducts>';
    fwrite($fh$stringData);
    fclose($fh);

    }


    ?>
    i suggerimenti sono sempre ben accetti

  5. #5
    io non ho tempo ne modo per testare il codice di quei link che avevo postato in quelle discussioni, solo che visto le fonti immagino che sia codice funzionante... cmq mi sembrava anche chiaro il metodo usato... potresti provare a mettere in pratica quel codice e magari ne riparliamo su dove si blocca il tuo codice: il punto è che non puoi usare simplexml ma devi usare parser che gestiscano meglio la memoria, come spiegato nei link che avevo messo

    poi un'altra cosa: è vero che php gestisce bene gli array, ma se hai un xml di 30 mb immagino che hai parecchi record quindi metterli tutti insieme in un array equivale a consumare una marea di memoria, rischiando inoltre di raggiungere i limiti di memoria dello script php... te non solo devi leggere in maniera parsimoniosa il file xml, ma devi scrivere gli xml più piccoli contestualmente alla lettura...cioè ogni tot giri devi fare il flush dell'array nell'xml più piccolo...

    Prova cerca di tirare fuori qualcosa poi se ne riparla... capisco che uno vorrebbe sempre il tutorial passo passo per fare le cose, ma non sempre si può averlo, soprattutto quando si chiedono cose un pò più particolari
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.