PHP/XML Validation qui dure des heures

PHP/XML Validation qui dure des heures - PHP - Programmation

Marsh Posté le 31-07-2005 à 18:18:29    

Je fais un ptit traitement XML sur un fichier XHTML mais je voulais utiliser GetElementById mais celui-ci nécessite une validation du fichier. J'ai donc mis avant mon appel $xhtml->validate(); mais après avoir testé avec XDebug la fonction prend 8sec pour s'éxecuter, je peux virer ça ?

Reply

Marsh Posté le 31-07-2005 à 18:18:29   

Reply

Marsh Posté le 01-08-2005 à 02:45:59    

up les gas :)

Reply

Marsh Posté le 01-08-2005 à 10:08:52    

C'est normal ;) Qui dit valider dit DTD nécessaire. Donc il doit télécharger la DTD sur le site du W3C, qui est bien bondé niveau demandes...
 
Donc suivant ton parseur, et si tu es maître de ton serveur web, tu peux foutre un catalogue XML pour qu'il cherche la dtd en locale... sinon, bah avec de l'xpath tu peux récupérer un truc facilement via l'id...

Reply

Marsh Posté le 01-08-2005 à 12:41:46    

C'est bien ce que je me disais qu'il récup la DTD sur W3C vu les logs.
 
En fait mon parseur c'est php avec l'interface DOM donc libxml
Je vais voir si il y a possibilité de foutre un catalogue (j'en avait entendu parler pour un autre parser mais j'ai pas percuté).
Pour l'XPath je vais voir sinon mais ça prend du temps aussi mais bon entre valider + getElementById et un XPath je pense que le XPath est plus rapide

Reply

Marsh Posté le 01-08-2005 à 14:20:02    

Ouais, grave plus rapide. Solution :
 

function &get_by_id(&$dom, $id) {
 
  $xpath_context =& xpath_new_context($dom);
  xpath_register_ns($xpath_context, 'html', 'http://www.w3.org/1999/xhtml');
 
  $xpath_result =& xpath_eval($xpath_context, '//*[@id="' . $id . '"]');
 
  if($xpath_result) {
 
    return $xpath_result->nodeset[0];
  }
}


 
C'est dommage que la recommandation xml:id ne soit pas encore sortie. Ca permet de mettre partout un attribut xml:id, du coup pas besoin de valider pour savoir quel attribut est de type ID...


Message édité par FlorentG le 01-08-2005 à 14:20:29
Reply

Marsh Posté le 01-08-2005 à 14:24:21    

http://php5.bitflux.org/xmlonspeed/slide_24.php montre qq optimisation, cependant c'est moins générique donc quand on sait où se trouve notre node un peu près il peut être sympa de l'optimiser :)
 
Merci sinon :)
 
Sinon fodra que je te pose qq question sur ton système de template XSLT parce que c'est ce dont je pensais faire pour mes futurs projets :)

Reply

Marsh Posté le 01-08-2005 à 14:25:51    

Ah ben c'est sûr que quand on sait où c'est :D Envoi un peu ta structure

Reply

Marsh Posté le 01-08-2005 à 14:46:23    

Je@nb a écrit :

up les gas :)


 
Je veux bien être gentil mais "les gas".....

Reply

Marsh Posté le 01-08-2005 à 14:49:12    

M Orthographe a écrit :

Je veux bien être gentil mais "les gas".....


"Je veux bien être gentil, mais «les gas»...

Reply

Marsh Posté le 01-08-2005 à 14:51:19    

C'est juste un fichier XHTML, donc déjà je peux lui dire de chercher dans le body et dans le paragraphe qui m'interresse.
Mon exemple est pas très interressant j'ai juste fait pour voir la puissance du DOM.

Reply

Marsh Posté le 01-08-2005 à 14:51:19   

Reply

Marsh Posté le 01-08-2005 à 14:51:25    

Tu as parfaitement raison FlorentG, j'ai omis la virgule...

Reply

Marsh Posté le 01-08-2005 à 14:52:00    

Du coup l'expression xpath serait :

/html/body/p[@id='pouet']

Reply

Marsh Posté le 01-08-2005 à 14:52:42    

Oué c'est ce que j'ai fait ;)
 
Merci en tout cas ;)

Reply

Marsh Posté le 01-08-2005 à 15:01:57    

Hmmm ta fonction il faut la mettre en php5 :D avec DOM et plus DOM XML :) jvais le faire :)

Reply

Marsh Posté le 01-08-2005 à 15:02:39    

Ouais là c'est du PHP4, mais domxml toujours ;)
 
Sous PHP4, c'est DOMXML
Sous PHP5, c'est DOM tout court :)

Reply

Marsh Posté le 01-08-2005 à 15:45:54    

Voila pour une version PHP5
 
A noter que DOMXpath->evaluate() n'est pas dispo avant php 5.1 :)
 

Code :
  1. function &get_by_id(&$dom, $location, $id) {
  2.   $xpath = new DOMXPath($dom);
  3.   $xpath->registerNamespace('html', 'http://www.w3.org/1999/xhtml');
  4.   $xpath_result = $xpath->query('/'.$location.'[@id="' . $id . '"]');
  5.   if($xpath_result) {
  6.     return $xpath_result->item(0);
  7.   }
  8. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed