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 |
#2 · Zasláno: 8. 2. 2012, 14:16:46
SimpleXML se používá snadno a zvládne i zanořené uzly.
|
||
JardaR Profil |
#3 · Zasláno: 8. 2. 2012, 19:04:38
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>"; } } |
||
Časová prodleva: 2 měsíce
|
|||
drowsy Profil |
#5 · Zasláno: 30. 3. 2012, 11:17:49
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)){ } |
||
Časová prodleva: 11 let
|
0