Parseur XML simplifié
Cette classe présente l'avantage de pouvoir être utilisée à partir du PHP 3 et son fonctionnement est très simple.<?
class XMLparser {
// --- Classe XML Parser ---
// Rôle: Analyse d'un fichier XML
// Fonctionnalité par défaut: RSS
function XMLparser($xmltype="RSS") {
// -- Constructeur du parseur
switch($xmltype) {
// Cette partie permet de pré-enregistrer des types de flux
case "RSS":
$this->root = "channel"; // Non utilisé à l'heure actuelle
$this->node = "item"; // Séparateur de chaque item
$this->fieldname = Array("title", "link", "description", "category", "pubDate", "author");
// Tableau des champs à prendre
break;
case "newsML":
$this->root = "";
$this->node = "article";
$this->fieldname = Array("idarticle", "medaillon", "titre", "chapeau", "corps");
break;
}
}
function XMLretrieve($xmlfile) {
// -- Lecture du flux (local ou distant)
$myxml = fopen($xmlfile, "r");
while (!feof($myxml)) {
$this->xml .= fgets($myxml, 4096);
}
fclose($myxml);
}
function XMLnodesplit() {
// -- Split du XML en un tableau d'objets
// Renvoit un tableau de la forme:
// Array[Item_n°] = Array(champ1, champ2, ..., champN)
$pattern = "@<".$this->node.">(.*)<\/".$this->node.">@Usi";
preg_match_all($pattern, $this->xml, $matches, PREG_SET_ORDER);
$i = 0;
foreach($matches as $tmp_item) {
$this->datas[$i] = $tmp_item[0];
foreach($this->fieldname as $balise) {
$this->XMLextract($balise, $i);
}
$i++;
}
}
function XMLextract($string, $level=0) {
// -- Transformation des objets en tableaux de strings
$pattern = "@<".$string.">(.*)<\/".$string.">@si";
preg_match($pattern, $this->datas[$level], $matches);
$this->field[$level][$string] = $matches[1];
}
}
?>
class XMLparser {
// --- Classe XML Parser ---
// Rôle: Analyse d'un fichier XML
// Fonctionnalité par défaut: RSS
function XMLparser($xmltype="RSS") {
// -- Constructeur du parseur
switch($xmltype) {
// Cette partie permet de pré-enregistrer des types de flux
case "RSS":
$this->root = "channel"; // Non utilisé à l'heure actuelle
$this->node = "item"; // Séparateur de chaque item
$this->fieldname = Array("title", "link", "description", "category", "pubDate", "author");
// Tableau des champs à prendre
break;
case "newsML":
$this->root = "";
$this->node = "article";
$this->fieldname = Array("idarticle", "medaillon", "titre", "chapeau", "corps");
break;
}
}
function XMLretrieve($xmlfile) {
// -- Lecture du flux (local ou distant)
$myxml = fopen($xmlfile, "r");
while (!feof($myxml)) {
$this->xml .= fgets($myxml, 4096);
}
fclose($myxml);
}
function XMLnodesplit() {
// -- Split du XML en un tableau d'objets
// Renvoit un tableau de la forme:
// Array[Item_n°] = Array(champ1, champ2, ..., champN)
$pattern = "@<".$this->node.">(.*)<\/".$this->node.">@Usi";
preg_match_all($pattern, $this->xml, $matches, PREG_SET_ORDER);
$i = 0;
foreach($matches as $tmp_item) {
$this->datas[$i] = $tmp_item[0];
foreach($this->fieldname as $balise) {
$this->XMLextract($balise, $i);
}
$i++;
}
}
function XMLextract($string, $level=0) {
// -- Transformation des objets en tableaux de strings
$pattern = "@<".$string.">(.*)<\/".$string.">@si";
preg_match($pattern, $this->datas[$level], $matches);
$this->field[$level][$string] = $matches[1];
}
}
?>
Exemple d'utilisation avec le fil RSS de ce site: