IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM] Parsage de sitemap


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    ...
    Inscrit en
    Avril 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : ...

    Informations forums :
    Inscription : Avril 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut [DOM] Parsage de sitemap
    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
    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
    et voilà ce que j'ai tenté
    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++;
    }
    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.
    Pour remédier à ça j'ai décidé de marquer les bloc à supprimer d'un attribut comme ceci
    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);
    		}
    	}
    }
    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 :
    - 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

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    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
    Yep, avec un DOMXPath. Quelque chose de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $xpath = new DOMXPath($doc);
    $nodes = $xpath->query('//[@todo="supprimer"]');
    foreach ($nodes as $node) {
       // ...
    }
    Devrait faire l'affaire.

    Mais c'est ton algo de départ qui est en cause, j'ai fait un test avec ce code:
    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
    30
    31
    32
    33
     
    <?php
     
    $xml = <<< XML
    <?xml version="1.0"?>
    <books>
    	<book>
    		<title>TEST 1</title>
    		<foobar>Lorem ipsum sit amet...</foobar>
    		<foobar>Lorem ipsum sit amet...</foobar>
    	</book>
    	<book>
    		<title>TEST 2</title>
    		<foobar>Lorem ipsum sit amet...</foobar>
    	</book>
    	<book>
    		<title>TEST 3</title>
    		<foobar>Lorem ipsum sit amet...</foobar>
    		<foobar>Lorem ipsum sit amet...</foobar>
    		<foobar>Lorem ipsum sit amet...</foobar>
    	</book>
    </books>
    XML;
     
    $doc = new DOMDocument;
    $doc->loadXML($xml);
     
    foreach ($doc->getElementsByTagName('foobar') as $node) {
    	$node->parentNode->removeChild($node);
    }
     
    header('Content-Type: text/xml');
    echo $doc->saveXML();
    et il s'avère que seul le dernier child de chaque node book est effectivement supprimé.
    En passant par un domxpath, ça fonctionne correctement:
    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
    30
    31
    32
    33
    34
    35
     
    <?php
     
    $xml = <<< XML
    <?xml version="1.0"?>
    <books>
    	<book>
    		<title>TEST 1</title>
    		<foobar>Lorem ipsum sit amet...</foobar>
    		<foobar>Lorem ipsum sit amet...</foobar>
    	</book>
    	<book>
    		<title>TEST 2</title>
    		<foobar>Lorem ipsum sit amet...</foobar>
    	</book>
    	<book>
    		<title>TEST 3</title>
    		<foobar>Lorem ipsum sit amet...</foobar>
    		<foobar>Lorem ipsum sit amet...</foobar>
    		<foobar>Lorem ipsum sit amet...</foobar>
    	</book>
    </books>
    XML;
     
    $doc = new DOMDocument;
    $doc->loadXML($xml);
     
    $xpath = new DOMXPath($doc);
     
    foreach ($xpath->query('//foobar') as $node) {
    	$node->parentNode->removeChild($node);
    }
     
    header('Content-Type: text/xml');
    echo $doc->saveXML();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DOM Parsage XML et fonction récursive
    Par DonKnacki dans le forum Général Python
    Réponses: 7
    Dernier message: 05/06/2014, 19h25
  2. Parsage de sitemap
    Par titinesaku dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 08/04/2011, 11h24
  3. [DOM] PHP et parsage de XML
    Par gandolfi dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 19/02/2007, 11h29
  4. [DOM] Parsage XML en PHP 4
    Par Huntress dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 07/12/2005, 22h24
  5. [parsage] SAX ou DOM ?
    Par sixkiller dans le forum APIs
    Réponses: 4
    Dernier message: 10/05/2004, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo