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:
-
$domNodeList = $domDocument->getElementsByTagname(''a'');
-
foreach ( $domNodeList as $domElement ) {
-
$domElement->parentNode->removeChild($domElement);
-
}
Pravilni zbris DOMNode objektov:
-
$domNodeList = $domDocument->getElementsByTagname(''a'');
-
foreach ( $domNodeList as $domElement ) {
-
$domElemensToRemove [] = $domElement;
-
}
-
-
foreach( $domElemensToRemove as $domElement ){
-
$domElement->parentNode->removeChild($domElement);
-
}
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:
-
-
// Poiščemo vse tage, ki jih želimo izbrisati
-
foreach($tagsToRemove as $r){
-
$tags = $doc->getElementsByTagName($r);
-
-
foreach($tags as $tag){
-
$willBeRemoved[] = $tag;
-
-
// Za vsak element, ki ga bomo izbrisali shranimo vse njihove otroke
-
$c = $tag->childNodes;
-
-
for($i=0;$i<$c->length;$i++){
-
$childrens[] = $c->item($i);
-
}
-
}
-
}
-
-
// Vse otroke dodano en nivo višje
-
foreach($childrens as $c){
-
$c->parentNode->parentNode->appendChild($c);
-
}
-
-
// Sedaj lahko mirno vse tage izbrišemo
-
foreach($willBeRemoved as $r){
-
$r->parentNode->removeChild($r);
-
}
Preimenovanje določenih elementov
-
foreach($toRename as $oldName => $newName){
-
// Poiščemo elemente s starim imenom
-
$tags = $doc->getElementsByTagName($oldName);
-
-
foreach($tags as $tag){
-
// Shranimo njihove otroke
-
$renameTags[] = $tag;
-
$c = $tag->childNodes;
-
-
// Kreiramo element z novim imenom
-
$element = $doc->createElement($newName);
-
-
// V nov element dodamo vse otroke
-
for($i=0;$i<$c->length;$i++){
-
$element->appendChild($c->item($i));
-
}
-
-
// Novi element dodamo v DOM strukturo
-
$tag->parentNode->appendChild($element);
-
}
-
}
-
-
// Stare elemente izbrišemo
-
foreach($renameTags as $r){
-
$r->parentNode->removeChild($r);
-
}
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:
-
<Product>
-
<CellId>500</CellId>
-
... ostali elementi
-
</Product>
-
<Product>
-
<CellId>480</CellId>
-
... ostali elementi
-
</Product>
-
$nodes = $doc->getElementsByTagName(''Product'');
-
-
// Dobimo vse Product elemente
-
foreach($nodes as $productItem){
-
$CellIdNodes = $n->getElementsByTagName(''CellId'');
-
if ($CellIdNodes->length != 0) {
-
// V začasno tabelo shranimo ID Producta (CellId celia)
-
// index predstavljajo ID-ji, vrednost Product element z vsemi pod-elementi
-
$products[$CellIdNodes->item(0)->nodeValue] = $productItem;
-
}
-
}
-
-
// Sortiramo tabelo produktov
-
knatsort($products);
-
-
// Kreiramo nov DOMDocument
-
$newDom = new DOMDocument(''1.0'',''UTF-8'');
-
$root = $newDom->createElement(''Root'');
-
$newDom->appendChild($root);
-
-
// Vse produkte, ki so sedaj pravilno razvrščeni dodamo v novo DomDocument strukturo
-
foreach($products as $product) {
-
$domNode = $newDom->importNode($product, true);
-
$root->appendChild($domNode);
-
}
-
-
// Izpišemo novo DOM strukturo v XML formatu
-
-
//Source: http://www.php.net/manual/en/function.natsort.php
-
//Here is a natsort that will sort the array based on keys (it is similar to the function posted earlier on 04-May-2006).
-
function knatsort(&$karr){
-
foreach($kkeyarr as $kcurrkey){
-
$ksortedarr[$kcurrkey] = $karr[$kcurrkey];
-
}
-
$karr = $ksortedarr;
-
return true;
-
}
Dodatne informacije
Kot vedno pa vam priporočam branje PHP DOMDocument online manual-a, kjer lahko najdete še več uporabnih zadev.
Podobni članki:
- Parse podatkov s spletne strani – php DomDocument
- Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8
- PHP funkcije v Javascript jeziku – isset
- Javascript – delci uporabne kode
- AJAX iskanje datotek, dodajanje v seznam ter predogled le teh (PDF, jpeg)
- PHP – ftp funkcionalnost (ftp funkcije)
- MySQL – date funkcije – current date, now, add date, sub date, interval
- Preprosta skripta – kreiranje Excel datoteke iz PHP tabele/array
- PHP POST Request – brez uporabe cURL knjižnice
- PHP & Javascript asociativna tabela (Associative array)



October 11th, 2009 ob 10:16 am
[...] Parse podatkov s spletne strani - php DomDocument « Prenovljena spletna stran trsplet.si DOMDocument – uporabne funkcije » 10th [...]