Jump to content
php.lv forumi

Citiem viegli.. citiem nee..


SadDemon

Recommended Posts

  • Replies 81
  • Created
  • Last Reply

Top Posters In This Topic

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).

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • 2 months later...

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

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)..

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

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

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


×
×
  • Create New...