Je cherche à parser un XML possèdant la structure suivante :
<BLOG>
<Article>
<Id></Id>
<Titre></Titre>
<Texte></Texte>
<IdEtat></IdEtat>
<Auteur></Auteur>
<comments>
<comment>
<Id></Id>
<Texte></Texte>
</comment>
</comments>
</Article>
<Article>
<Id></Id>
<Titre></Titre>
<Texte></Texte>
<IdEtat></IdEtat>
<Auteur></Auteur>
</Article>
</BLOG>
(tous les champs ne sont pas présents mais c'est histoire de simplifier l'affichage)
Mon but est de parcourir le XML pour qu'à chaque <Article>, j'associe une ligne dans un array (et à chaque champ, une colonne dans ce tableau).
A noter que je "désactive" certains champs dont je n'ai pas besoin.
Voici le code :
Code : Tout sélectionner
<?php
$num_article=0;
$articles=array();
function startHandler($xp, $name, $attribs)
{
global $IsOk;
global $nomchamp;
global $num_article;
switch ($name)
{
case "TEXTE":
$IsOk=1;
break;
case "ARTICLE":
$num_article=$num_article+1;
break;
default:
$IsOk=0;
break;
}
}
function endHandler($xp, $name)
{
// printf('handle end tag: %s<br />', $name);
$IsOk=0;
}
function cdataHandler($xp, $cdata)
{
global $IsOk;
global $nomchamp;
global $num_article;
global $articles;
if ($IsOk==1)
{
if (isset($articles[$num_article][$nomchamp]))
{
$articles[$num_article][$nomchamp]=$articles[$num_article][$nomchamp]+$cdata;
}
else
{
$articles[$num_article][$nomchamp]=$cdata;
}
}
}
$file="test.xml";
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startHandler", "endHandler");
xml_set_character_data_handler($xml_parser, "cdataHandler");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
global $articles;
foreach($articles as $champs)
{
foreach($champs as $valeurs)
{
echo "Le champ $valeurs a la valeur ".$valeurs;
}
}
?>Si quelqu'un a une idée (ou un parseur plus performant), je suis preneur