T&R splet blog o spletnih storitvah. Razgaljamo tehnologijo!

reference spletnih strani
11th October

DOMDocument – uporabne funkcije

Včeraj smo predstavili kako lahko s pomočjo PHP The Document object modula parsamo podatke iz spletnih strani oz. servisov. Danes si bomo pogledali še nekaj funkcij, ki vam bodo pomagale pri različnih operacijah nad DOM strukturo.

Izbris določenih elementov iz DOMNodeList

DOMNode objekta ne moremo direktno izbrisati iz DOMNodeList seznama znotraj foreach zanke, saj se iretacija v primeru izbrisa ustavi. Zato je potrebno vse objekte med iretacijo dodati v poseben array, nato pa pri iretaciji skozi array izbrišemo vsak element posebej.

Nepravilni izbris DOMNode objektov:

PHP:
  1. $domNodeList = $domDocument->getElementsByTagname(''a'');
  2. foreach ( $domNodeList as $domElement ) {
  3.   $domElement->parentNode->removeChild($domElement);
  4. }

Pravilni zbris DOMNode objektov:

PHP:
  1. $domNodeList = $domDocument->getElementsByTagname(''a'');
  2. $domElemensToRemove = array();
  3. foreach ( $domNodeList as $domElement ) {
  4.   $domElemensToRemove [] = $domElement;
  5. }
  6.  
  7. foreach( $domElemensToRemove as $domElement ){
  8.   $domElement->parentNode->removeChild($domElement);
  9. }

insertBefore iretacija

Enako, kot velja za izbris DOMNode elementov, velja tudi za insertBefore funkcijo.

Izbris DOMNode objektov, otroke teh objektov pa pustimo v DOM strukturi

Če bi uporabili removeChild za določene DOMNode bi izbrisali tudi vse njihove otroke. Torej, če želimo izbrisati le določene elemente znotraj DOM strukture, njihove otroke pa pustiti v DOM strukturi uporabimo sledečo funkcijo:

PHP:
  1. $tagsToRemove  = array();
  2. $willBeRemoved = array();
  3. $childrens     = array();
  4.  
  5. // Poiščemo vse tage, ki jih želimo izbrisati
  6. foreach($tagsToRemove as $r){
  7.     $tags = $doc->getElementsByTagName($r);
  8.    
  9.     foreach($tags as $tag){
  10.         $willBeRemoved[] = $tag;
  11.        
  12.                 // Za vsak element, ki ga bomo izbrisali shranimo vse njihove otroke
  13.         $c = $tag->childNodes;
  14.        
  15.         for($i=0;$i<$c->length;$i++){
  16.             $childrens[] = $c->item($i);
  17.         }
  18.     }
  19. }
  20.  
  21. // Vse otroke dodano en nivo višje
  22. foreach($childrens as $c){
  23.     $c->parentNode->parentNode->appendChild($c);
  24. }
  25.  
  26. // Sedaj lahko mirno vse tage izbrišemo
  27. foreach($willBeRemoved as $r){
  28.     $r->parentNode->removeChild($r);
  29. }

Preimenovanje določenih elementov

PHP:
  1. $renameTags = array();
  2. foreach($toRename as $oldName => $newName){
  3.          // Poiščemo elemente s starim imenom
  4.     $tags = $doc->getElementsByTagName($oldName);
  5.    
  6.     foreach($tags as $tag){
  7.                 // Shranimo njihove otroke
  8.         $renameTags[] = $tag;
  9.         $c = $tag->childNodes;
  10.                
  11.                 // Kreiramo element z novim imenom
  12.         $element = $doc->createElement($newName);
  13.  
  14.                 // V nov element dodamo vse otroke
  15.         for($i=0;$i<$c->length;$i++){
  16.             $element->appendChild($c->item($i));
  17.         }
  18.                
  19.                 // Novi element dodamo v DOM strukturo
  20.         $tag->parentNode->appendChild($element);
  21.     }
  22. }
  23.  
  24. // Stare elemente izbrišemo
  25. foreach($renameTags as $r){
  26.     $r->parentNode->removeChild($r);
  27. }

Razvrsitev vseh elementov po ID atributu

Sledeči primer predpostavlja, da imamo XML strukturo z elementi Product, znotraj teh elementov CellId element, ki ima shranjeno ID vrednost, ki jo nato uporabimo za sortiranje. Primer:

XML:
  1. <Product>
  2.   <CellId>500</CellId>
  3.   ... ostali elementi
  4. </Product>
  5. <Product>
  6.   <CellId>480</CellId>
  7.   ... ostali elementi
  8. </Product>

PHP:
  1. $products = array();
  2. $nodes = $doc->getElementsByTagName(''Product'');
  3.  
  4. // Dobimo vse Product elemente
  5. foreach($nodes as $productItem){
  6.     $CellIdNodes = $n->getElementsByTagName(''CellId'');
  7.     if ($CellIdNodes->length != 0) {
  8.                 // V začasno tabelo shranimo ID Producta (CellId celia)
  9.                 // index predstavljajo ID-ji, vrednost Product element z vsemi pod-elementi
  10.         $products[$CellIdNodes->item(0)->nodeValue] = $productItem;
  11.     }
  12. }
  13.  
  14. // Sortiramo tabelo produktov
  15. knatsort($products);
  16.  
  17. // Kreiramo nov DOMDocument
  18. $newDom = new DOMDocument(''1.0'',''UTF-8'');
  19. $root = $newDom->createElement(''Root'');
  20. $newDom->appendChild($root);
  21.  
  22. // Vse produkte, ki so sedaj pravilno razvrščeni dodamo v novo DomDocument strukturo
  23. foreach($products as $product) {
  24.     $domNode = $newDom->importNode($product, true);
  25.     $root->appendChild($domNode);
  26. }
  27.  
  28. // Izpišemo novo DOM strukturo v XML formatu
  29. echo $newDom->saveXML();
  30.  
  31. //Source: http://www.php.net/manual/en/function.natsort.php
  32. //Here is a natsort that will sort the array based on keys (it is similar to the function posted earlier on 04-May-2006).
  33. function knatsort(&$karr){
  34.     $kkeyarr = array_keys($karr);
  35.     natsort($kkeyarr);
  36.     $ksortedarr = array();
  37.     foreach($kkeyarr as $kcurrkey){
  38.         $ksortedarr[$kcurrkey] = $karr[$kcurrkey];
  39.     }
  40.     $karr = $ksortedarr;
  41.     return true;
  42. }

Dodatne informacije

Kot vedno pa vam priporočam branje PHP DOMDocument online manual-a, kjer lahko najdete še več uporabnih zadev.

Deli s skupnostjo:

  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

Podobni članki:

  1. Parse podatkov s spletne strani – php DomDocument
  2. Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8
  3. PHP funkcije v Javascript jeziku – isset
  4. Javascript – delci uporabne kode
  5. AJAX iskanje datotek, dodajanje v seznam ter predogled le teh (PDF, jpeg)
  6. PHP – ftp funkcionalnost (ftp funkcije)
  7. MySQL – date funkcije – current date, now, add date, sub date, interval
  8. Preprosta skripta – kreiranje Excel datoteke iz PHP tabele/array
  9. PHP POST Request – brez uporabe cURL knjižnice
  10. PHP & Javascript asociativna tabela (Associative array)

1 komentar na “DOMDocument – uporabne funkcije”

  1. Parse podatkov s spletne strani – php DomDocument | .: TRSplet - internetne storitve :. je napisal:

    [...] Parse podatkov s spletne strani - php DomDocument « Prenovljena spletna stran trsplet.si DOMDocument – uporabne funkcije » 10th [...]

Dodaj komentar