Jump to content
php.lv forumi

Izvilkt Atribūtu no XML Objekta


Bunkertor 7

Recommended Posts

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?

Link to comment
Share on other sites

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 by Bunkertor 7
Link to comment
Share on other sites

<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 by Bunkertor 7
Link to comment
Share on other sites

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 by briedis
Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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 by Bunkertor 7
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...