getElementById ne marche pas avec mon doc XML

getElementById ne marche pas avec mon doc XML - XML/XSL - Programmation

Marsh Posté le 03-06-2007 à 19:10:30    

Bonjour,
 
je voudrais savoir si le getElementById marche en javascript avec du xml ?
 
je m'explique :
j'ai un document xml simple :

Code :
  1. <test id="testt">
  2. <data id="truc"></data>
  3. </test>


 
et je voudrais récupérer tous les élements ayant l'id = "testt".
 
j'ai donc appliqué le code suivant :
 

Code :
  1. myVars = xmlDoc.getElementById('testt');


en faisant un alert(myVars) il me ressort null.
 
si je fais :

Code :
  1. alert(xmlDoc.childNodes.item(0).getAttribute("id" ));


 
il m'affiche bien "testt"
par conséquent il charge bien le document xml mais il n'arrive pas à faire une recherche par id.
quelqu'un aurait une idée ?  
 
Merci

Reply

Marsh Posté le 03-06-2007 à 19:10:30   

Reply

Marsh Posté le 03-06-2007 à 19:17:06    

lordankou a écrit :

et je voudrais récupérer tous les élements ayant l'id = "testt".


Tu veux dire que tu as plusieurs éléments avec le même id "testt" [:petrus dei]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-06-2007 à 19:26:08    

T'es sûr que c'est pas plutôt getElementsById() ?
 
Et effectivement, plusieurs elements avec le même id test c'est moyen :heink:

Message cité 1 fois
Message édité par esox_ch le 03-06-2007 à 19:26:27

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 03-06-2007 à 19:26:21    

oui voilà (fait pas cette tête je sais ce que je fais).

Reply

Marsh Posté le 03-06-2007 à 19:35:10    

esox_ch a écrit :

T'es sûr que c'est pas plutôt getElementsById() ?
 
Et effectivement, plusieurs elements avec le même id test c'est moyen :heink:


 
oui j'ai déjà essayé et c'est pas ça :
message: Statement on line 118: Type mismatch (usually a non-object value used where an object is required)
 
 
et je sais que c'est moyen mais c'est la façon la plus simple que j'ai trouvé pour faire ce que j'ai besoin de faire.

Reply

Marsh Posté le 03-06-2007 à 19:51:52    

lordankou a écrit :


et je voudrais récupérer tous les élements ayant l'id = "testt".


getElementById n'est pas sensé retourner un tableau hein on est d'accord ?

 

Sinon l'"id" ça veut rien dire dans un XML, donc ce serait pas étonnant que ça marche pas...
D'ailleurs le vrai nom de la fonction c'est bien window.document.getElementById() ;)

 

Tu peux pas utiliser getElementsByTagName ?

Message cité 1 fois
Message édité par theredled le 03-06-2007 à 19:53:22

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 03-06-2007 à 20:05:27    

theredled a écrit :


Tu peux pas utiliser getElementsByTagName ?


 
c'est pas l'envi qui m'en manque mais je reçois un fichier qui est découpé d'une façon qui ne permet pas d'utiliser de façon très efficace le getElementsByTagName (il retournerait beaucoup trop d'éléments).
je vais essayer de trouver un mix entre le getElementsByTagName et parcouris tout une nodelist pour trouver le bon élément.

Reply

Marsh Posté le 03-06-2007 à 20:10:14    

lordankou a écrit :

c'est pas l'envi qui m'en manque mais je reçois un fichier qui est découpé d'une façon qui ne permet pas d'utiliser de façon très efficace le getElementsByTagName (il retournerait beaucoup trop d'éléments).
je vais essayer de trouver un mix entre le getElementsByTagName et parcouris tout une nodelist pour trouver le bon élément.


ben, tu parcours juste ton tableau retourné par getElementsByTagName en regardant les id avec getAttribute() et hop... c'est exactement ce que fait getElementById  [:airforceone]  (en mieux : tu parcours pas TOUS les noeuds)


Message édité par theredled le 03-06-2007 à 20:11:04

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 03-06-2007 à 20:15:29    

Sinon, si la compatibilité Safari 2 n'importe pas, tu peux utiliser des requêtes XPath :o
 
C'est pas idéal vu que IE et [tous les autres] implémentent les requester XPath (et que sous IE ça ne fonctionne que sur une source XML, pas sur du HTML :o) mais ça part ça, xpath ça déboite gravos :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-06-2007 à 20:16:22    

oué mais ça m'évitait d'avoir à le programmer (on est informaticien donc partisant du moindre effort). de toute façon je viens de remarquer que en effet je dois parcourir toutes les valeurs pour calculer le min, le max et la moyenne.  
des fois je regrette une bonne base de donnée qui fera ça beaucoup plus facilement.

Reply

Marsh Posté le 03-06-2007 à 20:16:22   

Reply

Marsh Posté le 03-06-2007 à 20:23:22    

masklinn a écrit :

Sinon, si la compatibilité Safari 2 n'importe pas, tu peux utiliser des requêtes XPath :o
 
C'est pas idéal vu que IE et [tous les autres] implémentent les requester XPath (et que sous IE ça ne fonctionne que sur une source XML, pas sur du HTML :o) mais ça part ça, xpath ça déboite gravos :o


 
j'avais déjà regardé mais si je me rappelle bien ça pose des problèmes quand c'est utilisé à l'intérieur d'un fichier svg ce qui est mon cas.

Reply

Marsh Posté le 03-06-2007 à 20:28:13    

lordankou a écrit :

on est informaticien donc partisant du moindre effort


du moindre effort à long/moyen terme [:aloy] et pour un même résultat, voire mieux :o

 

le moindre effort à court terme c'est copier-coller, le moindre effort à long terme c'est prendre 10 min pour faire une fonction qui te servira pour le reste de ta vie/projet :o (et t'épargnera des heures au bout du compte)
En l'occurence j'y connait keud en XSL mais moi je ferais comme dit Masklinn, ça te servira pour plus tard [:ojap]


Message édité par theredled le 03-06-2007 à 20:32:20

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 03-06-2007 à 21:12:00    

oui je le sais bien. il ne faut pas forcément prendre tout ce que je dis au pied de la lettre.  
je suis le premier à dire qu'il faut avant tout unebonne analyse pour faire un bon projet mais dans une entreprise ou l'informatique est juste un outil on est hélas de faire l'impasse sur pas malde chose pour produire un truc qui marche mais qui est bancale. mais bon tant qu'on est pas le big boss on peut pas décider

Reply

Marsh Posté le 03-06-2007 à 22:56:49    

xml + javascript = e4x

Reply

Marsh Posté le 03-06-2007 à 23:31:44    

HouseMD a écrit :

xml + javascript = e4x


 
dommage que ça ne marche pas sous opera et ie les deux seuls navigateurs affichant correctement du SVG ce qui est la base de mon projet.  :D

Reply

Marsh Posté le 03-06-2007 à 23:45:21    

lordankou a écrit :

dommage que ça ne marche pas sous opera et ie les deux seuls navigateurs affichant correctement du SVG ce qui est la base de mon projet.  :D


Heuu firefox 1.5 et supérieur affichent très bien le SVG [:pingouino]
 
Genre http://upload.wikimedia.org/wikipe [...] pectre.svg s'affiche sans problème chez moi sous FF 1.5 [:dawak]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-06-2007 à 00:04:27    

gaste ça marche en effet.  
comme quoi mon reformatage a eu du bon :D

Reply

Marsh Posté le 04-06-2007 à 13:34:56    

j'aurai une autre question :
savez vous pourquoi pour chaque élément de mon fichier xml j'ai un élément "texte" vide ?  
j'ai déjà remarqué ce problème et je comprends vraiment pas pourquoi il va doubler tous mes éléments.

Reply

Marsh Posté le 04-06-2007 à 17:54:52    

Probablement parce que tu as écrit <data id="..."></data> et non <data id="..." />.
Tu peux normalement le faire disparaître avec un normalize() sur le root de ton document.

Reply

Marsh Posté le 05-06-2007 à 12:45:24    

rx__ a écrit :

Probablement parce que tu as écrit <data id="..."></data> et non <data id="..." />.
Tu peux normalement le faire disparaître avec un normalize() sur le root de ton document.


 
 
non mon document est bien formé en tout cas je le pense :
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
  3. <svg>
  4. <svg viewBox="22552.5 -470741.6 339552.5 461931.6"/>
  5. <svg viewBox="259302.4 -187290.5 42404.6 53380.6"/>
  6. <svg viewBox="36875.8 -457099 301309.1 441210.4"/>
  7. </svg>


 
et quand je fais un  

Code :
  1. var personIterator = svgDoc.evaluate('//svg', svgDoc, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null );
  2. alert(personIterator.singleNodeValue.childNodes.length);


 
il me sort 7 c'est à dire mes 4 svg + 3 element texte qui sont vides
par contre opera lui me ressort le bon nombre  :(

Reply

Marsh Posté le 05-06-2007 à 13:00:42    

lordankou a écrit :

Bonjour,
 
je voudrais savoir si le getElementById marche en javascript avec du xml ?


 
La méthode getElementById du DOM récupère un élément dont un attribut est de type ID. Ca se renseigne dans la DTD, et faut obligatoirement valider le doc avec la DTD donc, ce qui est impossible en JS :(
 
On peut très bien définir un attribut 'pouet', lui donner le type ID dans la DTD, et getElementById renverra l'élément dont l'attribut 'pouet' est égal à la valeur transmise. Ca n'a donc rien à voir avec le nom de l'attribut.
 
C'est évidemment complètement relou :D

Reply

Marsh Posté le 05-06-2007 à 13:07:25    

FlorentG a écrit :

La méthode getElementById du DOM récupère un élément dont un attribut est de type ID. Ca se renseigne dans la DTD, et faut obligatoirement valider le doc avec la DTD donc, ce qui est impossible en JS :(
 
On peut très bien définir un attribut 'pouet', lui donner le type ID dans la DTD, et getElementById renverra l'élément dont l'attribut 'pouet' est égal à la valeur transmise. Ca n'a donc rien à voir avec le nom de l'attribut.
 
C'est évidemment complètement relou :D


 
merci en fait j'ai trouvé plus ou moins un moyen contourné donc ça maismaintenant le plus gros problème vient de l'interprétation stupide du moteur gecko avec le xml (comme je l'ai expliqué au dessus).
d'après ce que j'ai pu lire il considère la tabulation comme un texte  :ouch: . voir pire un saut de ligne est considéré comme un élément texte. on se retrouve donc à être obliger de faire des codes non indenter ce qui est impossible dans certains cas.
bref là je suis un peu perdu... soit je dis "les utilisateurs de firefox vous devez utiliser un navigateur logique" soit je me pends...

Reply

Marsh Posté le 05-06-2007 à 13:17:18    

lordankou a écrit :

d'après ce que j'ai pu lire il considère la tabulation comme un texte  :ouch: . voir pire un saut de ligne est considéré comme un élément texte.


C'est pourtant parfaitement normal :D C'est voulu par la recommendation XML. Certaines librairies, comme la libxml permettent de supprimer tout espace blanc en trop lors de l'ouverture (je sais pas si c'est possible sous Gecko). C'est aussi quelque chose qu'on peut renseigner dans un schéma XML (on peut y faire plus de trucs que dans une DTD, mais le problème reste le même, faut valider, impossibilité, etc etc).
 
 
Donc là en gros t'es cuit : pas de getElementById, faut contourner. Et les textes vides (espaces, tabulations et retours chariots) considérés comme nodes textes. Faut aussi contourner...

Reply

Marsh Posté le 05-06-2007 à 13:23:41    

bon je vais pas faire mon fénéant en utilisant comme contournement : "utilisez opéra" et je vais me coltiner cette abération conforme aux standards.
en regardant sur différents j'ai constaté que je ne suis pas le seul à trouver ça totalement stupide. à la limite la tabulation ou l'espace ok mais le retour chariot...
enfin bon au boulot (comme si j'avais pas déjà assez à faire !)

Reply

Marsh Posté le 05-06-2007 à 13:35:06    

Comme dit, y'a plein de mécanisme pour changer le comportement par défaut, malheureusement ce n'est pas supporté par tout le monde :( Et c'est souvent source de performances en baisse, de conso mémoire en plus, et de temps de développements rallongés.
 
Dans un monde idéal, ton XML serait accompagné d'un XML-Schema, qui renseignerait sur la structure valide du document, quels attributs sont de type ID, et à quels éléments faut-il enlever les espaces blancs :)

Reply

Marsh Posté le 05-06-2007 à 14:13:31    

FlorentG a écrit :

Comme dit, y'a plein de mécanisme pour changer le comportement par défaut, malheureusement ce n'est pas supporté par tout le monde :( Et c'est souvent source de performances en baisse, de conso mémoire en plus, et de temps de développements rallongés.
 
Dans un monde idéal, ton XML serait accompagné d'un XML-Schema, qui renseignerait sur la structure valide du document, quels attributs sont de type ID, et à quels éléments faut-il enlever les espaces blancs :)


 
je dirais que le pire c'est quand on mixe plusieurs normes. dans mon casje dois mixer du svg avec du xml et le traitement sous firefox devient un vrai calvaire.
je regrette le temps ou il y avait qu'un seul navigateur. (et oui on pouvait optimiser le code ce qui est maintenant impossible, déjà que faire marcher un truc compliqué sur3 navigateurs relèvent du miracle).

Reply

Marsh Posté le 05-06-2007 à 14:23:55    

Justement, est-ce que le normalize() n'agirait pas aussi sur les tabulations?
La doc de Gecko dit

Citation :

Puts the specified node and all of its subtree into a "normalized" form. In a normalized subtree, no text nodes in the subtree are empty and there are no adjacent text nodes.


donc j'aurais tendance à dire que normaliser un texte contenant uniquement des tabulations revient à l'enlever, mais je n'ai pas testé.

Reply

Marsh Posté le 05-06-2007 à 14:42:48    

j'ai essayé et je n'ai vu aucune différence du moins sur les retour chariots qui sont vraiment le plus gros problème. autant les gens en générals n'indentent pas toujours autant les retours chariot sont presque toujours utilisés.  

Reply

Marsh Posté le 05-06-2007 à 18:42:30    

Effectivement, je viens de faire un test et la normalisation ramène plusieurs tabulations à un seul espace. Mais ça c'est pas très intéressant...
Cela dit que veux-tu faire exactement? En général on ne s'intéresse pas à ce qu'il y a entre les éléments, mais au contenu d'éléments bien définis où le texte à un sens.

Reply

Marsh Posté le 05-06-2007 à 18:54:02    

j'ai réussi à récupérer le coup en faisant en test de navigateur.
le problème dans mon cas c'est que je voulais récupérer des attributs d'éléments. donc je bouclais sur mes éléments qui devaient être toutes des viewbox et non des viewbox et des textbox. par conséquent à un moment donné il cherchait un attribut d'un textbox pensant que c'était un viewbox.  
salloperie navigateur va.

Reply

Marsh Posté le 05-06-2007 à 19:00:43    

Il ne faut pas oublier que dans un document XML il y a aussi des commentaires, des instructions de traitement, etc.
Donc si tu veux être sûr de ne regarder que les éléments, tu peux faire un "if (e instanceof Element) ..."

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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