Je viens de me mettre au XML avec la librairie SimpleXML intégrée à PHP 5. Tout marche parfaitement et j'arrive en 2 lignes à afficher tout ce que je veux de mon fichier
Le problème, c'est qu'il n'y a apparemment pas de fonction removeNode() ou removeChild() intégrée à cette classe, ce qui fait que je ne peux pas supprimer le noeud courant (utile dans mon cas car je fais un compteur de conenctés
Dans la doc PHP, quelqu'un a écrit une classe, extendedSimpleXML (class extendedSimpleXML extends SimpleXMLElement) qui contient une méthode removeNode...
Voici donc mon fichier XML (membres et invites sont séparés
CODE
<?xml version="1.0" encoding="windows-1250"?>
<online_users>
<members>
</members>
<guests>
<user>
<ip>01.234.56.789</ip>
<last_activity_time>1157100123</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
<user>
<ip>12.345.67.890</ip>
<last_activity_time>1157100456</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
<user>
<ip>23.456.78.901</ip>
<last_activity_time>1157100789</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
<user>
<ip>34.567.89.012</ip>
<last_activity_time>1157101234</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
</guests>
</online_users>
<online_users>
<members>
</members>
<guests>
<user>
<ip>01.234.56.789</ip>
<last_activity_time>1157100123</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
<user>
<ip>12.345.67.890</ip>
<last_activity_time>1157100456</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
<user>
<ip>23.456.78.901</ip>
<last_activity_time>1157100789</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
<user>
<ip>34.567.89.012</ip>
<last_activity_time>1157101234</last_activity_time>
<last_activity_url>/forums/index.php?show_forums</last_activity_url>
</user>
</guests>
</online_users>
et le code PHP :
CODE
$online_users = simplexml_load_file('././inc/online_users.xml');
$online_users = new extendedSimpleXML($online_users->asXML());
foreach ($online_users->guests->user AS $user)
if ($user->ip == $_SERVER['REMOTE_ADDR'])
{
$user->last_activity_time = time();
$user->last_activity_url = $_SERVER['REQUEST_URI'];
$found = true;
$online_users->asXML('././inc/online_users.xml');
}
elseif (time()-$user->last_activity_time > 180)
{
$user->removeNode();
$online_users->asXML('././inc/online_users.xml');
}
if (!$found)
{
$user = $online_users->guests->addChild('user');
$user->addChild('ip', $_SERVER['REMOTE_ADDR']);
$user->addChild('last_activity_time', time());
$user->addChild('last_activity_url', $_SERVER['REQUEST_URI']);
$online_users->asXML('././inc/online_users.xml');
}
$online_users = new extendedSimpleXML($online_users->asXML());
foreach ($online_users->guests->user AS $user)
if ($user->ip == $_SERVER['REMOTE_ADDR'])
{
$user->last_activity_time = time();
$user->last_activity_url = $_SERVER['REQUEST_URI'];
$found = true;
$online_users->asXML('././inc/online_users.xml');
}
elseif (time()-$user->last_activity_time > 180)
{
$user->removeNode();
$online_users->asXML('././inc/online_users.xml');
}
if (!$found)
{
$user = $online_users->guests->addChild('user');
$user->addChild('ip', $_SERVER['REMOTE_ADDR']);
$user->addChild('last_activity_time', time());
$user->addChild('last_activity_url', $_SERVER['REQUEST_URI']);
$online_users->asXML('././inc/online_users.xml');
}
Le problème est que la fonction removeNode() me fait apparemment sortir directement de ma boucle foreach, ce qui fait que je ne peux supprimer qu'un élément à la fois
... Une idée ?
P.S : ah oui, SimpleXML me supprime l'indentation lorsque je rajoute des éléments... Est-il possible de la restaurer ?
