Aller au contenu

Problème bizarre avec DOM et XPath


fragmonster

Messages recommandés

Bonjour,

j'utilise PHP5 et sa librairie DOM pour manipuler des fichier XML.

Je dois, entre autres, executer une requète XPath sur un fichier. Le souci est que ma requète qui fonctionne parfaitement sous XMLSpy, ne marche pas du tout sous PHP.

Par contre j'ai remarqué ceci : La balise racine de mon document s'appelle et contient les attributs suivants :

Si je supprime tous ces attributs pour ne garder que la requète se met à marcher sous PHP (???!!??)

C'est quoi ce beans?

Merci

PS - Ma requète originale est la suivante :

/gpx/wpt[@lon=.$_POST["lon]." and @lat=".$_POST["lat"]."]"

Elle marche sous XMLSpy et pas sous PHP

Si je veux qu'elle marche sous PHP je suis obligé de la modifer comme suit :

/gpx[*]/wpt[@lon=.$_POST["lon]." and @lat=".$_POST["lat"]."]"

Je suis obligé de faire un "/gpx[*]", ce qui est absurde...

Lien à poster

Bah c'est que je me dis finalement ... Ils nous ont bourré le mou à la sortie de PHP5 comme quoi la librairie DOM était maintenant en conformité avec le W3C et tout et tout et finalement, elle est peut être bien en conformité, mais elle est bourée de bug.

Un autre bug pas mal concerne la mise en forme de la chaine de sortie. Il y a une propriété fomatOutput (true/false) qui permet de formater la chaine de sortie en indentant correctement les balises. Ca marche super bien lorsque le DomDocument est créé "from scratch", mais ça ne marche pas lorsqu'il est créé à partir d'un fichier XML .... bref, DOM et PHP5 c'est bien, mais dès qu'on sort un peu des sentiers battus, c'est pas encore ça...

Lien à poster

Pour ceux que ça intéresserait, voilà comment j'ai contourné le problème :

$DomGpx = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = FALSE;
$XMLString = ereg_replace("])*>", "",file_get_contents($monfichier));
$DomGpx->loadXML($XMLString);

... traitement (requète XPath) ...

$gpxTag->setAttribute ("version","1.0");
$gpxTag->setAttribute ("creator","Velotrainer - http://www.velotrainer.net");
$gpxTag->setAttribute ("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
$gpxTag->setAttribute ("xmlns","http://www.topografix.com/GPX/1/0");
$gpxTag->setAttribute ("xsi:schemaLocation","http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd");
$DomGpx->save($monfichier);

Donc je récupère le contenu de mon fichier XML dans une string et je vire les attributs de à l'aide d'une regexp.

Et juste avant de réécrire dans mon finchier je remets les attributs de en place.

En faisant ç, ça marche impec.

Lien à poster
×
×
  • Créer...