Bunkertor 7 Posted June 25, 2012 Report Share Posted June 25, 2012 Uzrakstīju skriptu kas izvelk atribūtu no XML objekta, bet tagad skatos, ka ja vairākiem objektiem ir atribūts ar tādu pašu nosaukumu, tad skripts nestrādās. Manā gadījumā tā nav problēma bet skaidrības labad gribētu izlabot tā lai skripts strādātu ar jebkuru XML failu. $file='/path'; if (file_exists($file)) { $xml = simplexml_load_file($file); print_r($xml); } else { exit('Error opening the file'); } echo "<br/>"; $attrs = $xml->attributes(); $width = $attrs['width']; $height = $attrs['height']; echo $width; echo "<br/>"; echo $height; Šajā gadījumā objektam "base" ir atribūti "width" un "height" un šis "base" ir vienīgais, kuram ir atribūti ar šādu vārdu. Bet, piemēram, kas notiek, ja ir vairāki objekti: "base1", "base2" un "base3" un visiem ir šādi atribūti? Skripts nestrādā :( Mēģināju šādā veidā: $file='/path'; if (file_exists($file)) { $xml = simplexml_load_file($file); print_r($xml); } else { exit('Error opening the file'); } echo "<br/>"; foreach($xml->base1[0]->attributes() as $a => $b) { echo $a,'="',$b,"\"\n"; } It kā nekādu acīmredzamu kļūdu nav, bet kad palaižu skriptu, sanāk errors. Fatal error: Call to a member function attributes() on a non-object Nu kā tad tas nav objekts, ja viņš ir objekts? Quote Link to comment Share on other sites More sharing options...
v3rb0 Posted June 25, 2012 Report Share Posted June 25, 2012 sākumā pieliec error_reporting(E_ALL); pieliec pārbaudi ka xml failu izdevās ielādēt, izlabo xml failā kļūdas? Quote Link to comment Share on other sites More sharing options...
Bunkertor 7 Posted June 25, 2012 Author Report Share Posted June 25, 2012 (edited) Paldies. Principā man bija error reporting ieslēgts, es tikai šeit nekopēju iekšā lai pārredzamāk. Vienigais errors ko viņš izdod ir: Fatal error: Call to a member function attributes() on a non-object XML failus izdodas ielādēt. Pat mēģināju vienu galīgi nepareizu failu un vienalga ielādējās smuki. Ļoti šaubos ka vainīgs ir XML fails. Es izmēģināju dažādus XML failus, bez tam tanī programmā ko es rakstu man būs diezgan maza kontrole pār tiem XML failiem. Tie nāks no ļoti dažādiem resursiem un iespējams (visticamāk) būs ar kļūdām. Neskatoties uz to, šim skriptam vajadzētu strādāt ja "base" objekts satur šos "width" un "height" atribūtus... pat ja viss pārējais XML būtu galīgi sačakarēts. Edited June 25, 2012 by Bunkertor 7 Quote Link to comment Share on other sites More sharing options...
marrtins Posted June 25, 2012 Report Share Posted June 25, 2012 Pārādi XML Quote Link to comment Share on other sites More sharing options...
Bunkertor 7 Posted June 25, 2012 Author Report Share Posted June 25, 2012 (edited) <base1 width="100" height="50"> <option>A</option> <option>B</option> <option>C</option> </base1> Un tas ir viss. Ļoti vienkāršs un primitīvs. Pirmais skripts strādā gan ar šo XML gan ar jebkuru daudz lielāku un daudz sarežģītāku. Edited June 25, 2012 by Bunkertor 7 Quote Link to comment Share on other sites More sharing options...
marrtins Posted June 25, 2012 Report Share Posted June 25, 2012 Varbūt tā? $result = $xml->xpath("//*[@height]"); foreach($result as $item){ $attrs = $item->attributes(); print_r($attrs); } Quote Link to comment Share on other sites More sharing options...
Bunkertor 7 Posted June 26, 2012 Author Report Share Posted June 26, 2012 Paldies par risinājumu. Bet es tomēr gribētu izprast, kāpēc nedarbojas attributes() funkcija. Šorīt vēlreiz apskatīju ar skaidru galvu un neredzu kļūdu... :( Quote Link to comment Share on other sites More sharing options...
briedis Posted June 26, 2012 Report Share Posted June 26, 2012 Nu iemet te to XML, lai varam iečekot, vai tiešām "nestrādā"... Quote Link to comment Share on other sites More sharing options...
Bunkertor 7 Posted June 26, 2012 Author Report Share Posted June 26, 2012 (edited) Nu iemet te to XML, lai varam iečekot, vai tiešām "nestrādā"... Paldies. Pievienoju xml. feed.xml Edited June 26, 2012 by Bunkertor 7 Quote Link to comment Share on other sites More sharing options...
briedis Posted June 26, 2012 Report Share Posted June 26, 2012 (edited) Laikam sapratu kur ir problēma. Dotais XML ir vienkārši nevalīds (daļēji, jo valīds tas ir tikai tad, ja ir viens base tags). XMLā jābūt vienam pamata līmeņa tagam jebkurā gadījumā: <root> <base1>...</base1> <base2>..</base2> </root> Šis ir nepreizi! --> <base1>...</base1> <base2>...</base2> Pirmajai rindiņai XML failā būtu jābūt specifikācijai, piemēram: <?xml version="1.0"?> Tāpēc arī tavs gadījums strādā tad, ja ir viens tags -tas tiek uzskatīts par pamatu. Bet tiklīdz pievieno citus - tas vairs nav valīds XML (pārējie tagi, iespējams, tiek vienkārši atmesti). Edited June 26, 2012 by briedis Quote Link to comment Share on other sites More sharing options...
Bunkertor 7 Posted June 26, 2012 Author Report Share Posted June 26, 2012 Jep! Tev bija taisnība. Vaina tiešām bija xml failā. Bet... Izskatīju vairākus reālus paraugus un izskatās ka tie atribūti, kas man patiešām ir nepieciešami atradīsies root elementā. Patiesībā tie xml izskatīsies kaut kā šādi: <?xml version="1.0"?> <root width="120" height="90"> <base1 width="100" height="50"> <option>A</option> <option>B</option> <option>C</option> </base1> <base2 width="60" height="40"> <option>A</option> <option>B</option> <option>C</option> </base2> </root> Vai ir iespējams izdabūt atribūtus no root elementa ar kādu no xml apstrādes funkcijām? (neesmu regular expressions fans) Quote Link to comment Share on other sites More sharing options...
briedis Posted June 26, 2012 Report Share Posted June 26, 2012 Es nezinu, vai drīkst likt rootam atribūtus, bet kas tev liedz izveidot base0 tagu, kas satur viņus? Quote Link to comment Share on other sites More sharing options...
marrtins Posted June 26, 2012 Report Share Posted June 26, 2012 Bet es tomēr gribētu izprast, kāpēc nedarbojas attributes() funkcija. Kā nedarbojas? Darbojas tak. ->attributes() Tev atgriezīs konkrētās nodes atribūtus, nevis visus kas ir zem tās nodes. Ja vajag visus, var izmantot to xpath, ko augstāk minēju. Vai ir iespējams izdabūt atribūtus no root elementa ar kādu no xml apstrādes funkcijām? Jā, prasi root nodei tos atribūtus: $xml->attributes(); vai $result = $xml->xpath("//*[@height]"); lai dabūtu visām nodēm konkrētu atribūtu. Quote Link to comment Share on other sites More sharing options...
Bunkertor 7 Posted June 26, 2012 Author Report Share Posted June 26, 2012 Man jārēķinās ar to ka pār xml failiem man nebūs nekādas kontroles. Tie nāks no dažādiem resursiem un to skaits būs mērāms desmitos tūkstošu. Man vajadzēs 80 gadu, lai tiem visiem pievienotu base0 tagu :) Šā skripta uzdevums būs apstaigāt visus xml kas jau atrodas serverī un ķert jaunpienākošos un saglabāt viņu dimensijas datubāzē. Varbūt iespējams to root tagu apstrādāt kā Array un tad izvilkt tos width un height? Quote Link to comment Share on other sites More sharing options...
Bunkertor 7 Posted June 26, 2012 Author Report Share Posted June 26, 2012 (edited) lai dabūtu visām nodēm konkrētu atribūtu. Jā, bet man vajag tikai root taga dimensijas :) Parasti dimensijas saturēs tikai root tags bet teorētiski iespējams, ka arī citi apakštegi saturētu width un height un tādā gadījumā skriptam sajuks "fiška". Jā, prasi root nodei tos atribūtus: Ā, nu laikam man pieleca :) Edited June 26, 2012 by Bunkertor 7 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.