Portál AbcLinuxu, 10. května 2025 05:24
Ahoj,
mam potize v importu XML souboru pomoci SimpleXML v PHP. Data jsou bez potizi, ale ke kazdymu zaznamu chci i ID, ktery je jako atribut. Normalne pomoci foreach kdyz nemusim resit pozici "kurzoru" v objektu SimpleXML to jde jak po masle. Ale pokud to delam pro FOR cyklus, jelikoz resim jednotlivy casti a mam na to nejakej algoritmus, kterej to rozdeli a importuje postupne - tak jsou potize. Ilustracni cast kodu vytrzena z kontextu vypada asi takhle:
$sxml = simplexml_load_file($this->EXTRACT_FOLDER . $this->xmlFile);
for ($i = $startingWith; $i < $limit; $i++) {
$vmAtributes = $sxml->ELEMENT[$i]->attributes();
$vmAtr = $vmAtributes['id'];
Tenhle kod ovsem nahlasi nize uvedenou hlasku a at delam co delam, proste se touhle jinak beznou cestou nikam nedostavam. Jediny co vim, ze kdyz dam natvrdo jeste pred FOR cyklem treba $sxml->ELEMENT[12345]->attributes() ... tak to projde, ale do cyklu se nejak nedostane zrejme ani samotny objekt SimpleXML - tam uz nezjistim nejen atributy elementu, ale ani vnitrni prvky pomoci inkrementovane hodnoty. Setkal se s tim nekdo? Mozna delam nejak zacatecnickou chybu, o tom, ze bych nemohl volat instanci tridy inicializovanou vne cyklu nejak nevim, ale uz to tak skoro vypada... Uz zacinam byt trochu nervozni :)
Fatal error: Call to a member function attributes() on a non-object in
Diky moc,
Standa
$myxml ='<?xml version="1.0"?>
<main version="1.0">
<polozky>
<polozka id="1">
<cena>25</cena>
<name>hustej mobil</name>
</polozka>
<polozka id="2">
<cena>255</cena>
<name>mycka rybicek</name>
</polozka>
</polozky>
</main>';
$xml = simplexml_load_string($myxml);
for($i = 0; $i < count($xml->polozky->polozka); $i++){
echo $xml->polozky->polozka[$i]->cena;
echo $xml->polozky->polozka[$i]['id'];
}
snad ti to pomuze
Tyhle varianty uz jsem zkousel, ale kdepak. Pes bude bud zakopanej jinde nebo nevim. Pokud bych ty tvy dva ECHO prikazy mel pred smyckou FOR a misto $i dosadil index v rozsahu, kterej v XML souboru skutecne je, pak se to zobrazi ok. Pokud to samy udelam ve smycce, zobrazi se prazdno... jako by tam fakt ten objekt (u tebe $xml) nebyl viditelnej.
Jeste doplnim. Pokud v tom cyklu FOR dam vypsat (ac je to samo blbost) urcitej prvek natvrdo (treba echo $sxml->ELEMENT[100]->PRVEK;), tak to projde. Takze co neumi uvnitr toho cyklu je echo $sxml->ELEMENT[$i]->PRVEK. Nevim ovsem proc, jelikoz zase necham-li echo $i, tak hezky vypise celou tu radu indexu a nema problem. Nemusi byt to $i nejak v uvozovkach nebo neco? Dalsi dulezita informace je, ze takovy kazdy prvek vkladam na danou pozici do pole a to pole pak vlozim jako jeden prvek do hlavniho pole - na konci pruchodu tim FOR cyklem.
Tak jsem na to prisel. Chyba byla jak jinak na moji strane, ikdyz dost skryta - do cyklu FOR jsem predaval v ramci OOP hodnoty pro prvni a druhy argument a pri vypsani samotneho id pruchodu cyklem bylo vse ok. Nicmene poradove cislo v SimpleXML objektu je zrejme potreba predavat explicitne jak INT... Tudiz vse vyresilo dosazeni funkce intval:
for($i = intval($startingWith); $i < intval($limit); $i++) {
treba to pomuze i nekomu dalsimu. Stane se to zrejme pouze v pripade kdy je FOR v metode, ktera prijima odjinud argumenty $startingWith a $limit. Hledal jsem chybu jinde, nez by clovek cekal, ze bude...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.