Bonjour,
Je sollicite votre aide pour un soucis que j'essaye de résoudre depuis plusieurs jours en vain...
Je suis en train de parser un de mes sitemap dans le but de détecter les liens morts et donc de purger le xml. Voila un exemple du xml à parser
et voilà ce que j'ai tenté
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6<url> <loc>http://mon-url-a-tester</loc> <lastmod>....</lastmod> <changefreq>.....</changefreq> <priority>....</priority> </url
Mon objectif et de supprimer chaque bloc <url> qui répond avec une erreur 404. Ça ça fonctionne mais un problème se pose quand deux (ou plus) bloc à supprimer se suivent. En effet le test étant dans un foreach, le fait de supprimer un bloc fait "remonter" le code d'un cran et du coup le test n'est plus indexé au bon endroit. Je ne sais pas si je suis très claire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 $listeUrl = $dom->getElementsByTagName('url'); $listeLoc = $dom->getElementsByTagName('loc'); $i=0; foreach($listeUrl as $url) { $valeur = $listeLoc->item($i)->nodeValue; $test_url = @get_headers($valeur,1); if(strstr($test_url[0], '404')) { $url->parentNode->removeChild($url); } elseif(isset($test_url[1]) && strstr($test_url[1], '404')) { $url->parentNode->removeChild($url); } $i++; }
Pour remédier à ça j'ai décidé de marquer les bloc à supprimer d'un attribut comme ceci
Mais du coup je me retrouve dans la même situation que celle précédente, dès que je supprime un bloc, le test perd son indexation. Du coup j'ai deux questions à poser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 $listeUrl = $dom->getElementsByTagName('url'); $listeLoc = $dom->getElementsByTagName('loc'); $i=0; foreach($listeUrl as $url) { $valeur = $listeLoc->item($i)->nodeValue; $test_url = @get_headers($valeur,1); if(strstr($test_url[0], '404')) { $url->setAttribute('todo', 'supprimer'); } elseif(isset($test_url[1]) && strstr($test_url[1], '404')) { $url->setAttribute('todo', 'supprimer'); } $i++; } $listeTest = $dom->getElementsByTagName('url'); foreach($listeTest as $test) { if($test->hasAttribute('todo')) { if(($test->getAttribute('todo')) == "supprimer") { $test->parentNode->removeChild($test); } } }
- Est-ce qu'il existerais un moyen de sélectionner tous les blocs ayant comme attribut todo="supprimer" et d'utiliser un while pour tous les supprimer
- Ou bien faut-il procéder d'un autre manière depuis le départ ?
Merci d'avance
Partager