Jump to content
php.lv forumi

Citiem viegli.. citiem nee..


Recommended Posts

Posted

Vai tie 8 Mb operatīvās atmiņas ir vienlīdzīgi *.php faila apjoms + parsējamā *.xml faila apjoms? ..vai kā es varu būt pārliecināts par to, cik šī funkcija aizņem operatīvās atmiņas?

  • Replies 81
  • Created
  • Last Reply

Top Posters In This Topic

Posted

Nē, php faila izmēram ar to nav sakara. Visvairāk jau atmiņas patērēs ielasītie stringi un citi dati, tb tavs xml fails. Taču ņem vērā, ka vienam xml baitam neatbildīs precīzi viens baits atmiņā, jo tā DOM bibliotēka iekšienē var veidot visādas viltīgas datu struktūras, ka aizņem vairāk vietas.

Bet jā, pēc noklusējuma konfigurācijas tu nevarēsi noparsēt xml failu izmērā lielāku par 8MB (īstenībā daudz mazāku).

Posted

Var izmantot xml_parse funkcijas. Būs sarežģītāk, bet vismaz nepiegružos atmiņu. Nolokosi failu, lādēsi failu ar xml_parse pa dažiem kB un vienlaicīg rakstīsi jaunajā failā. Beigās pārrakstīsi veco failu ar jauno un atlokosi.

  • 2 months later...
Posted (edited)

khmm.. ievietoju jautājumu klāt iepriekšējam, jo lieta atbilstoša..

 

Problēma ir - nekādi neprotu piekļūt iekšējiem mezgliem.. izmantojam php dom funkcijas..

 

*.xml faila izrāvums:

<node label = "---- galerijas">
<node label = "---- (galerija)">
	<node label = "---- (kategorija)">
		<node label = "----.jpg" />
		<node label = "----.jpg" />
		<node label = "----.jpg" />
	</node>

	<node label = "---- (kategorija)">
		<node label = "----.jpg" />
		<node label = "----.jpg" />
		<node label = "----.jpg" />
	</node>

u.t.t..

 

..piemēram, kā iegūt iekšējā mezgla (kur "----.jpg") label atribūtu?

 

Ja rodas jautājums - kāpēc ir tikai "node" mezgli un "lable" atribūti - tad atbilde ir - paredzēts Flash Tree komponentam..

 

Jau iepriekš pateicos!

Edited by SadDemon
Posted

Nju, ja daram: $node = $dom->childNodes[0]->childNodes[0]->getAttribute("label");

..tad seko "Fatal error: Cannot use object of type DOMNodeList as array"..

 

bet.. ja: $node = $dom->childNodes->item(0)->childNodes->item(0)->getAttribute("label");

..tad tam seko "Fatal error: Call to undefined method DOMText::getAttribute()"!

 

Nekādi neizprotu kāpēc.. (varbūt man kas piemirsies)..

Posted

tur takš rakstīts :)

$dom->childNodes ir DOMNodeList instance;

$dom->childNodes->item(0)->childNodes->item(0) ira DOMText instance, kurai nav tāda getAttribute() metode; ja netici php paziņojumiem, ta kaut vai ar get_class() pārbaudīt var.

Posted

Pag .. kāpēc tur ir DOMText? DOMText vai tad nav tad, kad, piemēram, xml fragmentā "<aa>bbb</aa>" bbb strings?

Kas tev tādā gadījumā ir $dom? tb uz kurieni tas norāda. Gadījumā par dziļu neņem?

 

A par to DOMText - vajag kādreiz manuāli uzšķirt:

 

http://lv2.php.net/manual/en/ref.dom.php

DOMText

 

Extends DOMCharacterData.

Tātad skatamies tai pat lapā DOMCharacterData klasi:

DOMCharacterData->substringData() - Extracts a range of data from the node

 

Par manuāļa lietošanu takš nav jāmaksā! Tā lietošana ir pilnīgi bez maksas.

Posted (edited)

<?php

$xml_source = "tree_source.xml";

$dom = new DomDocument();
$dom->load($xml_source);

$node = $dom->childNodes->item(0)->getAttribute("label");

echo $node;

?>

 

..*.xml:

<node label = "---- galerijas">
<node label = "---- (galerija)">
	<node label = "---- (kategorija)">
		<node label = "----.jpg" />
		<node label = "----.jpg" />
		<node label = "----.jpg" />
	</node>

	<node label = "---- (kategorija)">
		<node label = "----.jpg" />
		<node label = "----.jpg" />
		<node label = "----.jpg" />
	</node>

 

..iegūstam pirmā mezgla label, bet kā tālak? ..tur arī seko tie error.

Edited by SadDemon
Posted (edited)

Pēc nervus bendējošiem mēģinājumiem, secinājums ir:

 

# izmantojot getElementsByTagName(), visi pakārtotie mezgli nostājas vienā līmenī..

# tātad, ja rakstam - $node = $dom->getElementsByTagName("node")->item(3)->getAttribute("label");

..iegūsim pirmo mezglu, kur label ir iekļauts "----.jpg".. u.t.t.

 

Šajā gadījumā man tas nekādi neder..

 

 

Palūgšu piemēru (netieku skaidrs)!

 

Kā iegūt 4. līmeņa node label?

Edited by SadDemon
Posted (edited)

neesu skatījies tās dom f-jas, bet no tās infos kas tepat piemērā, var salikt to visu rekursijā un tiksi pie visiem labeļiem.

function dump($node, $level=1) {
if(isset($node -> childNodes) && get_class($node -> childNodes) == 'DOMNodeList')
	foreach($node -> childNodes as $childNode)
	{
		if(get_class($childNode) == 'DOMElement')
			printf ("level %d; label:%s\n",$level, $childNode -> getAttribute("label"));
		dump($childNode, $level+1);
	}
else return;
}

$xml_source = "t.xml";
$dom = new DomDocument();
$dom->load($xml_source);

dump($dom);

 

edit: ar visiem leveļiem

Edited by v3rb0
Posted

ņemam pirmo koka elementu, padodam viņu kādai f-jai. f-ja paskatās vai padotajam ir chaildi, ja ir, tad ar katru čaildu izdara to pašu ko sākumā darījām ar pirmo koka elementu.


×
×
  • Create New...