| 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: 14 let
|
|||
0