SadDemon Posted August 23, 2007 Author Report Share Posted August 23, 2007 un kā iegūt kādu konkrētu labeli 4. līmenī zinot viņa indexu parentChild'ā? Link to comment Share on other sites More sharing options...
SadDemon Posted August 23, 2007 Author Report Share Posted August 23, 2007 Balstoties uz v3rb0 iepriekš nopostēto skriptu, mazliet izpratu funkcijas principus un izveidoju līdzīgu funkciju, kas visu iekļauj iekš array().. tas manai acij draudzīgāks izskatās.. *.php <?php function domToArray($node, $level = 0) { $array = array(); // if node has attributes if ($node->hasAttributes()) { $attributes = $node->attributes; if (!is_null($attributes)) { foreach ($attributes as $attribute) { $array[$attribute->name] = $attribute->value; echo "[".$level."]\n".$array[$attribute->name]."<br>"; } } } // if node has childnodes if ($node->hasChildNodes()) { $child = $node->childNodes; for ($i = 0; $i < $child->length; $i++) { $iChild = $child->item($i); $array[$iChild->nodeName] = domToArray($iChild, $level+1); } } } $xml_source = "tree_source.xml"; $dom = new DomDocument(); $dom->load($xml_source); domToArray($dom); ?> Jautājums ir - kā lai piekļūst kādam konkrētam mezglam? Link to comment Share on other sites More sharing options...
bubu Posted August 23, 2007 Report Share Posted August 23, 2007 Atgriez tos masīvus no funkcijas - http://php.net/return. Tik sliktums zini kāds - ar šādu funkciju tu pazaudē visu DOM parsera izmantošanas jēgu. Tad jau vienkāršāk (un efektīvāk izpildes ātruma un izmantotās atmiņas ziņā) ir lietot SAX parseri, kas salasīs tev tās nodes masīvos. DOM jēga jau ir tieši tāda, ka tev ir pieejams viss kods atmiņā piekļūšanai patvaļīgām nodēm pēc tavas patikas. Link to comment Share on other sites More sharing options...
SadDemon Posted August 24, 2007 Author Report Share Posted August 24, 2007 ..principā nepareizi izteicos, mērķis ir mainīt konkrētam mezglam label atribūtu.. un zinu tikai katras parentNodes un childNodes indeksu.. Link to comment Share on other sites More sharing options...
SadDemon Posted August 24, 2007 Author Report Share Posted August 24, 2007 Izskaidrošu visu smalkāk: Gala produkts ir administrēšana galerijai iekš Flash.. kur ir tree komponents, kas saņem datus no *.xml: <node label="---- galerijas"> <node label="---- (galerija)"> <node label="---- (kategorija)"> <node label="--.jpg"/> </node> <node label="---- (kategorija)"> <node label="----.jpg"/> <node label="----.jpg"/> <node label="----.jpg"/> </node> </node> </node> ..un datus par attēliem saņem no attiecīga *.xml: <gallery title="----" thumbDir="-----" imageDir="----" random="false"> <category name="----"> <image> <date>----</date> <title>----</title> <desc>----</desc> <thumb>----.jpg</thumb> <img>----.jpg</img> </image> </category> </gallery> Mainot informāciju, ar *.php nomainam konkrētās nodes label atribūtu pirmajā *.xml un informāciju otrajā *.xml.. Te arī tā problēma, kad cenšos pirmajā *.xml failā piekļūt nodēm, ņemot galerijas nodes indexu.. galerijas nodes indexu un attēla nodes indexu.. Link to comment Share on other sites More sharing options...
SadDemon Posted August 24, 2007 Author Report Share Posted August 24, 2007 Nu iespējams pagaidām esmu kaut nedauds virzījies uz priekšu.. Tākā iepriekšējais label man ir pieejams iekš Flash, tad ir iespēja salīdzināt un pārrakstīt.. *.php: <?php function domToArray($node, $level = 0) { $array = array(); // if node has attributes if ($node->hasAttributes()) { $attributes = $node->attributes; if (!is_null($attributes)) { foreach ($attributes as $attribute) { $array[$attribute->name] = $attribute->value; echo "[".$level."]\n".$array[$attribute->name]."<br>"; // if nodes attribute equals value, update attribute if ($array[$attribute->name] == "----.jpg") { $node->setAttribute("label", $array[$attribute->name]." [testējam]"); // save global $dom; global $xml_source; $dom->save($xml_source); } } } } // if node has childnodes if ($node->hasChildNodes()) { $child = $node->childNodes; for ($i = 0; $i < $child->length; $i++) { $iChild = $child->item($i); $array[$iChild->nodeName] = domToArray($iChild, $level+1); } } } $xml_source = "tree_source.xml"; $dom = new DomDocument(); $dom->load($xml_source); domToArray($dom); ?> Link to comment Share on other sites More sharing options...
bubu Posted August 24, 2007 Report Share Posted August 24, 2007 Eh.. ka nesaprotu šito ņemšanos. Es būtu rakstījis sekojoši: <?php function change($root, $kat, $idx, $target) { $galerijas = $root->getElementsByTagName("node"); // visaam galerijaam foreach ($galerijas as $galerija) { $kategorijas = $galerija->getElementsByTagName("node"); // meklee konkreeto kategoriju foreach ($kategorijas as $kategorija) { if ($kategorija->getAttribute("label") == $kat) { $childs = $kategorija->getElementsByTagName("node"); if ($idx < $childs->length) { $childs->item($idx)->setAttribute("label", $target); return true; // ir nomainiits } else { return false; // nav taada indeksa konkreetajaa kategorijaa } } } } return false; // nav taadas kategorijas } $kat = "kategorija_b"; // kuru kategoriju mainiit $idx = 1; // otrais elements $target = "uz_ko_nomainiit_labeli"; $dom = new DomDocument(); $dom->load("a.xml"); $result = change($dom->documentElement, $kat, $idx, $target); if ($result == false) { echo "Kautkaads errors, lol!\n"; } $dom->save("b.xml"); ?> Un ja tas ir par lēnu, tad aizvietotu visus fjas getElementsByTagName() izsaukumus par ->firstChild, un visus foreach ciklus par ->nextSibiling Link to comment Share on other sites More sharing options...
Recommended Posts