SadDemon
Reģistrētie lietotāji-
Posts
52 -
Joined
-
Last visited
Everything posted by SadDemon
-
saistībā ar šo visu, tika atrasts: $dom->preserveWhiteSpace = false; // izņemam tukšumus pirms ielādes.. parsēšanas $dom->formatOutput = true; // pie saglabāšanas, dati ir smuki sakārtoti
-
jā, bet ja mērķis ir to visu informāciju pārrakstīt citā (jaunā) failā.. tikai sakārtotu.. vai tā vispār ir pieņemama lieta; vai tas būtu pavisam nepareizi.. nerunājot par to vai tam ir liela/maza nozīme..
-
Par rekursīvo funkciju sapratu, bet ..lieta, kas neizdodas ir: samazināt atkāpi, jo ar Dom ejot caur nodēm, aizvēršanas tagu tas nemaz neskaita..
-
Lūdzu mazu piemēru, citādi nekādi neizdodas (pietrūkst zināšanu)..
-
Ir nepieciešamība pēc kādas funkcijas, kas no: <node><node>text</node><node>text</node></node> galā iegūtu: <node> <node>text</node> <node>text</node> </node> ..paldies!
-
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); ?>
-
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..
-
..principā nepareizi izteicos, mērķis ir mainīt konkrētam mezglam label atribūtu.. un zinu tikai katras parentNodes un childNodes indeksu..
-
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?
-
un kā iegūt kādu konkrētu labeli 4. līmenī zinot viņa indexu parentChild'ā?
-
Liels paldies v3rb0, uzreiz ir grūti sagremot šo visu, tomēr tas ir tas kas vajadzīgs..
-
Vai tiešām neviens neizpalīdzēs?
-
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?
-
<?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.
-
..tik tuvs ar dom un php kopumā vēl neesmu; Vai var palūgt kādu piemēru - kā tad man iegūt tos atribūtus?
-
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)..
-
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!
-
..paldies, paldies andrisp un v3rb0.. viss kārtībā!
-
..ahā! Tik tiešām.. Bet labi - man būtu nepieciešams sortēt pēc "category" atribūta. Kas būtu jāpamaina, lai sortētu pēc kategorijas?
-
Problēma - kārtojot masīvu pazūd dublikāta dati.. lūdzu kādu skaidrojumu, kāpēc tas tā? *.php faila saturs: <?php $doc = new DOMDocument; $doc -> load('test_input.xml'); $content = array(); $products = $doc -> getElementsByTagName('product'); foreach ($products as $product) { $id = $product -> getAttribute('id'); $category = $product -> getAttribute('category'); $row = "product id: $id - category: $category"; $content[$category] = $row; } ksort ($content); foreach ($content as $output) { echo $output."<br>"; } ?> un *.xml faila saturs: <?xml version="1.0" encoding="utf-8"?> <root> <product id="1" category="a" /> <product id="2" category="g" /> <product id="3" category="d" /> <product id="4" category="b" /> <product id="5" category="a" /> </root> Output: product id: 5 - category: a product id: 4 - category: b product id: 3 - category: d product id: 2 - category: g ..sekojoši, kur pazūd - <product id="1" category="a" /> - kā to novērst?
-
*.xml saturs ir: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <Noliktava produkcijai="----"> <product id="1" amount="2" name="test" color="test" article="-" category="citi" status="ir" catalog="test" page="-" price="-" /> <product id="2" amount="7" name="vizītkaršu etvija" color="metāls" article="50042" category="birojam" status="ir" catalog="Reflect" page="87" price="2.64" /> <product id="3" amount="25" name="vizītkaršu etvija" color="metāls" article="ap802301" category="birojam" status="ir" catalog="Anda Present" page="39" price="1.16" /> <product id="4" amount="127" name="vizītkaršu etvija" color="metāls" article="1602270" category="birojam" status="ir" catalog="Marksmans (vecais)" page="-" price="2.19" /> </Noliktava> un *.php saturs ir: <?php $amount_input = '2'; $name_input = ''; $category_input = ''; $status_input =''; $doc = new DOMDocument; $doc -> load('../xml/depot.xml'); $content = array(); $products = $doc -> getElementsByTagName('product'); foreach ($products as $product) { $id = $product -> getAttribute('id'); $amount = $product -> getAttribute('amount'); $name = $product -> getAttribute('name'); $color = $product -> getAttribute('color'); $article = $product -> getAttribute('article'); $category = $product -> getAttribute('category'); $status = $product -> getAttribute('status'); if(ereg($amount_input, $amount)) { $row = "<"."product id=\"".$id."\" amount=\"".$amount."\" name=\"".$name."\" color=\"".$color."\" article=\"".$article."\" category=\"".$category."\" status=\"".$status."\" />"."<br>"; $content[$id] = $row; } } ksort($content); foreach ($content as $output) { echo $output; } ?> Problēma Nr.1 - ja meklējamais ir "2" starp amount atribūtiem, tad atrodam.. "2", "25" un "127".. bet nepieciešams ir tikai "2" un "25".. tobiš, lai meklētu tikai no pirmā simbola.. Problēma Nr.2 - vajadzētu panākt, lai.. ja $amount_input nav tukš un pārējie ir, tad "ereg($amount_input, $amount)".. ja $amount_input nav tukš un, piemēram, $category_input nav tukš.. tad "(ereg($amount_input, $amount) && ereg($category_input, $category))".. Iepriekš pateicos par palīdzību!
-
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?
-
Nu mans skripts tagad ir šāds: <?php $doc = new DOMDocument; $doc -> load('../xml/depot.xml'); $content = array(); $products = $doc -> getElementsByTagName('product'); foreach ($products as $product) { $id = $product -> getAttribute('id'); $amount = $product -> getAttribute('amount'); $name = $product -> getAttribute('name'); $color = $product -> getAttribute('color'); $article = $product -> getAttribute('article'); $category = $product -> getAttribute('category'); $status = $product -> getAttribute('status'); $row = " <"."product id=\"".$id."\" amount=\"".$amount."\" name=\"".$name."\" color=\"".$color."\" article=\"".$article."\" category=\"".$category."\" status=\"".$status."\" />"; $content[$id] = $row; } ksort($content); $myXML = "../xml/temporary.xml"; $ending = "</Noliktava>"; $data = file_get_contents($myXML); $data = substr($data, 0, strpos($data, $ending)-1); foreach ($content as $output) { echo $output; $newData = "$output "; $data.=$newData; } $final_data = $data. $ending; $fHandle = fopen($myXML, "w+"); fwrite($fHandle, $final_data); fclose($fHandle); ?> ..apjomi itkā ļoti lieli nebūs, bet varētu tuvāk paskaidrot - kas ir tā "maģiskā 8 Mb robeža"?
-
Vēlreiz paldies.. gan bubu, gan andrisp! ..viss kārtībā..
-
Paldies "bubu"! Gan beigās vēl vajadzētu "</Noliktava>" tagu, tākā rakstīšana notiek iekš "foreach".. tur to likt nevar. Kā lai dabū dokumenta beigas, lai pievienotu aizveramo tagu? *.php saturs: <?php // .... $myXML = "../xml/temporary.xml"; $ending = "</Noliktava>"; $data = file_get_contents($myXML); $data = substr($data, 0, strpos($data, $ending)-1); foreach ($content as $output) { echo $output; $newData = "$output "; $data.=$newData; $fHandle = fopen($myXML, "w+"); fwrite($fHandle, $data); } fclose($fHandle); ?>