Autor Zpráva
JardaR
Profil
Zdravím, měl bych prosbičku pro chytré hlavy. Snažím se proniknout do tajů zpracování XML, ale je to pro mě částečně španělská vesnice. Rád bych zpracoval velký XML soubor s daty pomocí PHP a data vložil do MySQL a kód, který jsem si kdysi napsal na to již není stavěn. Podařilo se mi vygooglovat následující krátký kód, který je jednoduchý a oproti předchozímu výrazně rychlejší.
$xml = new XMLReader();
$xml->open($soubor);

while ($xml->read() && $xml->name !== 'Zasoba');

while ($xml->name === 'Zasoba') {
 $node = $xml->expand();
 $row = array();
 foreach ($node->childNodes as $child) {
  if ($child->nodeType === XML_ELEMENT_NODE) {
    $row[$child->nodeName] = $child->textContent;
  }
 }
 unset ($node);

$nazev = $row['Vyrobce'];
echo $nazev;

//$mysqlQuery = "INSERT INTO ...";
//$mysqlResult = mysql_query($mysqlQuery,$databaze) or die(mysql_error());

$xml->next('Zasoba');
}

Zpracovávaný XML je např. tento:
<Zasoba>
    <Cena>261.5383</Cena>
    <Vyrobce>Moje</Vyrobce>
    <KmKarta>
        <Nazev>Vyrobek</Nazev>
    </KmKarta>
    <Kategorie>
        <name></name>
        <parent>
              <name></name>
              <parent>
                    <name></name>
              </parent>
        </parent>
     </kategorie>         
</Zasoba>

Problém je, že umí zpracovat pouze první úroveň tagů jako <Cena> či <Vyrobce>, ale další vnořené např. <Nazev> již neumím po několika marných pokusech z XML dostat. Lze toho nějakým způsobem pomocí tohoto kódu docílit? Navíc dochází k podobné situaci, kdy bych se snažil získat <name> z <kategorie> a zároveň se snažil strukturu vnoření zpracovat.
Spectator
Profil
SimpleXML se používá snadno a zvládne i zanořené uzly.
JardaR
Profil
Děkuji za odpověď. Pomocí Simple jsem to původně měl, viz.

$xml=simplexml_load_file($soubor);
foreach ($xml->SeznamZasoba->Zasoba as $param) { 
$vyrobce = $param->Vyrobce; // vyrobce
$nazev = $param->Popis; // nazev zbozi
echo $vyrobce . "<br />"; 
echo $nazev . "<br />";
}

Ale tady právě neumím zpracovat tag <castky>, který se opakuje, viz. příklad

<Zasoba>
    <Vyrobce>Moje</Vyrobce>
    <Nazev>Vyrobek</Nazev>
    <castky>
        <cena>
           <cena1>503</cena1>
        </cena>
        <cena>        
           <cena2>608</cena2>
        </cena>
    </castky>
    <castky>
        <cena>        
           <cena1>108</cena1>
        </cena>
        <cena>
           <cena2>125</cena2>
        </cena>
    </castky>
</Zasoba>

Zkoušel jsem například vnořený foreach, ale bez úspěchu. Děkuji za nakopnutí.
tatyalien
Profil
Zkus si tam dodat:

<?php
if(isset($param->castky)){
   foreach($param->castky->cena as $castkaUzel) {
     echo $castkaUzel . "<br>";
  }
}
Psáno z hlavy
drowsy
Profil
JardaR:
Možná by stálo za to zkusit si nainstalovat knihovnu PEAR XML Serializer / XML Unserializer. Použití je pak velmi jednoduché, (un)serializer načítá i ukládá, s údaji se pracuje pak jako s vícerozměrným polem.

http://pear.php.net/package/XML_Serializer/redirected
Příklad použití (načtení XML, psáno z hlavy, snad jsem tam neseknul nějakou chybu):
            $options = array(
                'complexType' => 'array',
                'parseAttributes' => 'false',
                'encoding' => 'UTF-8,
                'targetEncoding' => 'UTF-8'
            );
            $unserializer = new XML_Unserializer($options);
            $unserializer->unserialize($filepath, true);            
            $data = $unserializer->getUnserializedData();                        
            // pro případ chyby, třeba nulové velikosti XML nebo jinak nevalidního XML
            if(is_object($data)){
            
            }
            // pokud je výsledkem pole, tak se zpracují data
            if(is_array($data)){    

            }    

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: