Extraire le contenu d’un élément XML

© Christian PAULUS. Document créé le 22 avril 2011 , mis à jour le 22 avril 2011.

On ne va jamais aussi loin que lorsqu'on ne sait pas où l'on va. Christophe Colomb

Accueil du site > Astuces > PHP > Extraire le contenu d’un élément XML

Comparatif / PHP 5

Comment extraire rapidement le contenu d’un élement de votre document XML.

Script de test :

<?php

/**
 *
 * Test comparatif performance
 * pour extraction contenu XML
 * via
 * - PCRE
 * - DOMdocument
 * - strstr + ...
 * 
 * @see http://www.quesaco.org/Extraire-le-contenu-d-un-element-XML
 */

$eol = ((PHP_SAPI == 'cli')    ? '' '<br />')
    .
PHP_EOL
    
;

/**
 * Petite fonction locale
 * pour vérifier extraction
 */
function local_echo ($matches)
{
    global 
$eol;
    
    foreach (
$matches as $str) {
        echo 
$str.$eol;
    }
}

/**
 * Extraire via PCRE
 */
function f_preg_match ($html)
{
    
$matches = array();
    
    
preg_match_all (
                    
'{<strong[^>]*>(.*)<\/strong[^>]*>}'
                    
$html
                    
$matches
                    
);
    
    
//local_echo ($matches[1]);
}

/**
 * Extraire via DOMdocument
 */
function f_DOM_parse ($html)
{
    
$matches = array();
    
    
$dom = new DOMDocument();
    
$dom->loadHTML($html);
    
    
// rassemble tous les noeuds
    
$nodeList $dom->getElementsByTagName('strong');
    
    if (
$nodeList->length)
    {
        
// parcourt la liste des noeuds
        
$ii 0;
        while (
$item $nodeList->item($ii++)) {
            
$matches[] = strval($item->nodeValue);
        }
    }
    
    
//local_echo ($matches);
}

/**
 * Extraire via strstr() et strpos()
 */
function f_substr ($html)
{
    
$matches = array();
    
    while ((
$html strstr ($html'<strong')) !== FALSE)
    {
        if ((
$pos strpos ($html'>')) !== NULL)
        {
            
$html substr ($html$pos+1);
            
            if (
                (
$str strstr ($html'</strong'TRUE)) !== NULL
                
)
            {
                
$matches[] = $str;
                
$html strstr ($html'<strong');
            }
            else {
                
// erreur de document
                // manque tag fermant
                
break;
            }
        }
    }
    
//local_echo ($matches);
}

function 
tester_fonction ($funct$legend '')
{
    global 
$html;
    
    
$start microtime(1);
    
    for ( 
$ii 0$ii 100$ii++ )
    {
        
$funct($html);
    }
    
    
$result microtime(1) - $start;
    
    
$legend $legend ?: $funct;
    
    return (
$legend.': '.$result' μs'); 
    
}

echo (
tester_fonction ('f_preg_match'
                       
'Fonctions PCRE        '
                       
).$eol);

echo (
tester_fonction ('f_DOM_parse'
                       
'Fonctions DOMdocument '
                       
).$eol);

echo (
tester_fonction ('f_substr'
                       
'Fonctions de chaines  '
                       
).$eol);

?>

A télécharger : le script de test complet, avec son objet XHTML.

Résultat :

Fonctions PCRE        : 0.0011270046234131 μs
Fonctions DOMdocument : 0.0092089176177979 μs
Fonctions de chaines  : 0.00091218948364258 μs

L’utilisation des fonctions liées au traitement des chaînes de caractères donne un bon résultat, pour un code légèrement complexe (qui ne s’est pas mélangé les pinceaux entre strpos et strstr (caractère ou chaîne) ?).

Le résultat à l’usage de PCRE reste proche de celui des fonctions de chaînes, pour un code plus compact et plus lisible, au familier de PCRE.

La classe DOMdocument a toujours eu cette réputation de lenteur. Pour un traitement simple comme celui exposé ici, l’intérêt semble limité. Pour les amateurs de classes ?

Documents joints

Plussoyez !

Les forums sont fermés.