[JS] dom ? Xpath ? infos !![résolu!!!] merci mozilla :)

merci mozilla :) [JS] dom ? Xpath ? infos !![résolu!!!] - HTML/CSS - Programmation

Marsh Posté le 21-01-2003 à 10:58:24    

hello
j'aimerais savoir s'il existe Xpath ou un truc semblable pour trouver un noeud particulier d'un objet dom dans JS ?
 
je sais pas si je me suis bien exprimé ..
en fait le problème pour l'instant c que je suis obligé de faire des boucles récursives de malade pour trouver le bon noeu à modifier et ça rame et c pas très bon, donc e cherche peut être des méthodes propres à dom permettant de retrouver rapidement une branche, un noeud donné ? j'espère que vous pouvez me répondre car ça urge un peu :o  et que je galère pour l'instant à coder mes propres méthodes xpath foireuses :/
 
voilà et si possible il me faudrait un truc qui marche sur ie et mozilla ... mais je trouve pas trop de liens à ce sujet sue le net :/


Message édité par k666 le 21-01-2003 à 21:56:54
Reply

Marsh Posté le 21-01-2003 à 10:58:24   

Reply

Marsh Posté le 21-01-2003 à 11:00:01    

Fait voir un bout de ton code ou tu fais une boucle...
 

Reply

Marsh Posté le 21-01-2003 à 11:06:55    

hum bon c neuf, je viens de commencer hein donc pas taper :D
 
mais bon c pas le but du jeu, je veux pas corriger mon code, mais trouver un truc fait pour ça, je veux pas réinventer la roue, j'ai surtout pas le temps car fo ke je finisse une tonne de méthodes pour vendredi, fo que si on me dit:
rajoute  
  noeud:
  /module/utilisateur/preferences/volume_audio
  valeur:
  10
 
je puisse éventuellement créer un noeud tel que ...
 
<module>
  <utilisateur>
      (.......)
    <preferences>
      (.......)
      <volume_audio>
        10
      </volume_audio>
    </preferences>
  </utilisateur>
</module>
 
 
 
bon le code que j'ai commencé à faire c de la merdouille mais bon pas le choix :/
 
 

Code :
  1. // recherche à partir d'un noeud d'entrée un noeud ou tableau de noeuds
  2. // suivant un motif donné ...
  3. function findNode(entryNode,strPath)
  4. {
  5. if (entryNode == null)
  6. {
  7.  return null;
  8. }
  9. var node = entryNode ;
  10. var match = firstElement(strPath);
  11. var reste = resteOf(strPath);
  12. if ( match != "" )
  13. {
  14.  var tmp = node.childNodes;
  15.  var returnedObjs = new Array();
  16.  var cnt = 0;
  17.  for ( var i = 0 ; i < tmp.length ; i ++ )
  18.  {
  19.   var tmpret = null;
  20.   switch(node.nodeType)
  21.   {
  22.    // element
  23.    case 1:
  24.     if (tmp[i].nodeName == match)
  25.      tmpret = findNode(tmp[i],reste);
  26.     break;
  27.    // document
  28.    case 9:
  29.     tmpret = findNode(tmp[i],strPath);
  30.     break;
  31.    // texte
  32.    case 3:
  33.    // process instruction
  34.    case 7:
  35.    // CDATA
  36.    case 4:
  37.    // comment
  38.    case 8:
  39.    case 10:
  40.    default : tmpret = null;
  41.   }
  42.   if (tmpret != null)
  43.   {
  44.    returnedObjs[cnt++] = tmpret;
  45.   }
  46.  }
  47.  if (returnedObjs.length < 1)
  48.  {
  49.   return null;
  50.  }
  51.  else
  52.  {
  53.   return returnedObjs;
  54.  }
  55. }
  56. else
  57. {
  58.  return entryNode ;
  59. }
  60. }
  61. // renvoi le premier mot d'une chaine slashée /aze/zer/ert => aze
  62. function firstElement(slashString)
  63. {
  64. var tmp = slashString.split("/" );
  65. if (tmp.length >= 2)
  66. {
  67.  return tmp[1];
  68. }
  69. return "" ;
  70. }
  71. // renvoi le reste d'une chaine slashée /aze/zer/ert => /zer/ert
  72. function resteOf(slashString)
  73. {
  74. var tmp = slashString.split("/" ) ;
  75. var ret = "" ;
  76. if (tmp.length >= 2)
  77. {
  78.  for ( var j = 2 ; j < tmp.length ; j ++ )
  79.  {
  80.   ret += "/" + tmp[j] ;
  81.  }
  82. }
  83. return ret ;
  84. }
  85. /// c cette fonction qui declenche le traitement
  86. function test()
  87. {
  88. var xmlDocument = getXMLDocumentFromFrame(parent.xml_data);
  89. var tmp = xmlDocument ;
  90. var prout = findNode(tmp,"/information/scorm" );
  91. alert(prout);
  92. }


Message édité par k666 le 21-01-2003 à 11:08:26
Reply

Marsh Posté le 21-01-2003 à 11:17:18    


walli  
  Posté le 21-01-2003 11:13:01                  
 
--------------------------------------------------------------------------------
Ton noeud, tu le rajoutes dans quoi ?  
 
 
 
k666  
  Posté le 21-01-2003 11:16:13                        
 
--------------------------------------------------------------------------------
bin ça rajoute pas encore de noeu... pour l'instant ça renvoi un tableau avec tous les chemins possibles, paske il se peut qu'un noeud soit pas unique ...
ça renvoi donc la référence vers le noeud donné, et après tu peux créer des sous noeuds ...
mais bon jlai fait vite fait et me suis rendu compte tout de suite de la complexité du code à développer et c pour ça que je cherche un truc préfait pour pas me prendre la tête :// et c pour ça que je demande aux connaisseurs de m'aider!!!! je dois vraiment avancer et je peux pas réinventer la roue, car c pour vendredi            

Reply

Marsh Posté le 21-01-2003 à 11:39:17    

apparemment il y a JSPATH pour mozilla, et il y a selectNodes() dans MSXML .... mais bon je cherche un truc ommun aux deux, ou bien à défaut de ceci, de l'aide en général, des expériecnes témoignages etc...

Reply

Marsh Posté le 21-01-2003 à 11:46:19    

Pour Mozilla je sais pas.
Pour IE, effectivement tu as selectNodes().
En fait tu fait un  

Code :
  1. selectNodes("//module/utilisateur/preferences/volume_audio" )


Et pour chaque noeud trouvé, tu boucles jusqu'a etre remonte à la racine...
Y a pas de méthode toute faite pour ce genre de choses (je crois pas), tu vas donc être forcé de pondre un minimum de code...
 
 
 

Reply

Marsh Posté le 21-01-2003 à 21:55:20    

bon, comme je suis super sympa je vais ous donner la solution ;) j'ai construit un ptit script d'adaptation, pour que l'on puisse parler de la meme façon à un DOM sous ie et sous mozilla ...
 

Code :
  1. function scriptableXml(domtarget)
  2. {
  3. this.doc = domtarget ;
  4. }
  5. function getXMLDocumentFromFrame (frameWindow) {
  6.    if (frameWindow.document && frameWindow.document.XMLDocument) {
  7.      return frameWindow.document.XMLDocument;
  8.    }
  9.    else {
  10.      return frameWindow.document;
  11.    }
  12. }
  13. function isIE()
  14. {
  15. var nav = getnavtype();
  16. if (nav.indexOf("microsoft" ) >= 0)
  17.  return true;
  18. return false;
  19. }
  20. function isMOZ()
  21. {
  22. var nav = getnavtype();
  23. if (nav.indexOf("netscape" ) >= 0)
  24.  return true;
  25. return false;
  26. }
  27. function getnavtype(){
  28. appname = navigator.appName;
  29. appname = appname.toLowerCase();
  30. appversion = navigator.appVersion;
  31. appversion = appversion.toLowerCase();
  32. return appname + " " + appversion;
  33. }
  34. function test()
  35. {
  36. var scrXml = new scriptableXml(getXMLDocumentFromFrame(parent.xml_data))
  37. scrXml.findXpath = function(xpath_motif)
  38.  {
  39.    var ret = new Array();
  40.    var cnt = 0;
  41.    if (isIE())
  42.    {
  43.     var tmp = this.doc.selectNodes(xpath_motif);
  44.     for (var i=0;i<tmp.length;i++)
  45.     {
  46.      ret[cnt++] = tmp[i];
  47.     }
  48.    }
  49.    else if (isMOZ())
  50.    {
  51.     var tmp = this.doc.evaluate(xpath_motif,this.doc,null,4,null);
  52.     while (i = tmp.iterateNext())
  53.     {
  54.      ret[cnt++] = i;
  55.     }
  56.    }
  57.    return ret;
  58.  }
  59. alert(scrXml.findXpath("//type" ).length);
  60. }


 
 
fo appeler la fonction test() en supposant que celle ci se trouve sur un frame et que la frame contenant le xml s'appelle xml_data ... voilà merci bien à tous ceux qui m'auront aidé, j'espère aussi que ce script pourra servir à bcp d'entre vous qui héistent à passer leurs scripts sous mozilla,.... mozilla c un super navigateur, ya tout skia de mieux dedans!! ... ma solution se trouvait tout betement dans le site w3.org !
 
http://www.w3.org/TR/2002/WD-DOM-L [...] nding.html
 

Reply

Marsh Posté le 21-01-2003 à 22:01:56    

si ça intéresse quelqu'un je peux poster un truc plus clean :) un exemple parlant quoi!
 
voil :) :hello:
 
 
edit: en distillant un peu on peut en ressortir ça:
 

Code :
  1. var ret = new Array();
  2.           var cnt = 0;
  3.           if (isIE())
  4.           {
  5.              var tmp = objet_dom.selectNodes(xpath_motif);
  6.              for (var i=0;i<tmp.length;i++)
  7.              {
  8.                 ret[cnt++] = tmp[i];
  9.              }
  10.           }
  11.           else if (isMOZ())
  12.           {
  13.              var tmp = objet_dom.evaluate(xpath_motif,objet_dom,null,4,null);
  14.              while (i = tmp.iterateNext())
  15.              {
  16.                 ret[cnt++] = i;
  17.              }
  18.           }
  19.           return ret;


 
 
o`u ret est un tableau contenant tous les noeuds concernés par le xpath_motif donné ...


Message édité par k666 le 22-01-2003 à 00:27:25
Reply

Marsh Posté le 22-01-2003 à 16:21:46    

bon alors pour les fans de ces technologies! un lien vers un ptit moteur de recherche coté client!!!!
 
 
http://pouet.cocomatic.net/xml/index.html
 
 
suffit de mettre des expressions XPath
 
par exemple
 
/
 
ou bien  
 
//type
 
 
ou bien
 
//type[@name="CMIBlank"]
 
 
 
:)

Reply

Marsh Posté le 24-01-2003 à 20:43:00    

up ptit up :) suite à quelques améliorations!

Reply

Sujets relatifs:

Leave a Replay

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