Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1659 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  DOMParser et problème avec noeud bidon

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

DOMParser et problème avec noeud bidon

n°982451
Filoche1
Posté le 15-02-2005 à 16:40:00  profilanswer
 

Salut à tous.
 
Premièrement, j'utilise Xerces dans mon projet Java.
 
Je dois produire un parser dans le but d'afficher un document XML.
 
Cependant, en utilisant DOMParser j'ai des noeud qui sont uniquement des espaces blancs.
 
Par exemple :
 
<message>
    <sequence>1</sequence>
</message>
 
est différent de :
 
<message><sequence>1</sequence></message>
 
Le premier contiendera un element (bidon) à cause du l'espace (les ... rouges représentent une tabulation faite dans mon éditeur xml).  Donc <Message> a comme enfant - espace et <sequence>.
 
Existe t'il un moyen d'avoir uniquement les "vrai" noeuds ?
 
Merci à l'avance.

mood
Publicité
Posté le 15-02-2005 à 16:40:00  profilanswer
 

n°982452
FlorentG
Posté le 15-02-2005 à 16:40:52  profilanswer
 

Je connais rien en Xerces, mais en général dans les parser DOM, y'a une option pour virer les "Text Nodes"

n°982461
Filoche1
Posté le 15-02-2005 à 16:43:58  profilanswer
 

Ouais j'y ai pensé mais rien n'y fait.  Je n'ai accès à aucunes méthodes permettant d'ignorer les espaces.
 
J'utilises Xerces 2.6.2

n°982634
Filoche1
Posté le 15-02-2005 à 19:08:01  profilanswer
 

Il semble avoir la fonction :
 
setIncludeIgnorableWhitespace(bool) de la classe DOMParser.
 
Cependant je n'ai pas accès à cette méthode.  J'ai l'erreur suivante :
 
The method setIncludeIgnorableWhitespace(boolean) is undefined for the type DOMParser
 
J'utilise l'importe suivant :
 
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
 
Merci pour vos suggestions!
 
 

n°982636
FlorentG
Posté le 15-02-2005 à 19:10:29  profilanswer
 

Ouaip, c'est effectivement cette propriété qui doit jouer :/ Maintenant bizarre qu'elle soit indéfinie, je vais jeter un coup d'oeil dans la doc

n°982638
Filoche1
Posté le 15-02-2005 à 19:13:15  profilanswer
 

Merci bien.
 
Pourtant mon programme fonctionne bien (mis à part les nodes indésirables).
 
Donc Xerces doit être installé correctement...Étrange comme vous dites...

n°982639
FlorentG
Posté le 15-02-2005 à 19:14:31  profilanswer
 

J'trouve pas avec com.sun.org.apache.xerces :??: Je n'arrive qu'a trouver les API genre org.w3c ou org.xml ?

n°982652
Filoche1
Posté le 15-02-2005 à 19:23:49  profilanswer
 

Ma liste d'importe est la suivante :
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
 
Est-il possible que Xerces soit mal installé?  Que je puisse tout de même utiliser certaiens méthodes de DOMParser mais que pour d'autres il y est un problème ?

n°982654
Filoche1
Posté le 15-02-2005 à 19:25:49  profilanswer
 

Si cela peut aider voici mon code
 
try
  {  
   parser = new DOMParser();  
   
   parser.setIncludeIgnorableWhitespace(true);
   parser.parse(path);    //Parse the file
   parser.setIncludeIgnorableWhitespace(true);
   doc = parser.getDocument();  //Get the document
     
   root = doc.getDocumentElement(); //Get the root element
   
  }
     catch (Exception e)  
  {
      e.printStackTrace(System.err);    
       
             
  }

n°982655
FlorentG
Posté le 15-02-2005 à 19:26:08  profilanswer
 

En fouillant, je trouve cette page, et le namespace a cette tronche :

org.apache.xerces.parsers.DOMParser


Message édité par FlorentG le 15-02-2005 à 19:26:19
mood
Publicité
Posté le 15-02-2005 à 19:26:08  profilanswer
 

n°982657
FlorentG
Posté le 15-02-2005 à 19:26:55  profilanswer
 

Et y'a bien la fonction setIncludeIgnorableWhitespace

n°982661
Filoche1
Posté le 15-02-2005 à 19:29:04  profilanswer
 

Conclusion :
 
il ya un problème avec mon import ?

n°982662
FlorentG
Posté le 15-02-2005 à 19:30:04  profilanswer
 

Possible, et donc avec org.apache.xerces.parsers.DOMParser, ça donne quoi ?

n°982667
Filoche1
Posté le 15-02-2005 à 19:32:46  profilanswer
 

The import org.apache.xerces.parsers.DOMParser cannot be resolved
 
(J'utilise Eclipse) qui me propose de régler l'importe et qui le change pour  
 
import com.sun.org.apache.xerces.internal.parsers.DOMParser;  

n°982668
FlorentG
Posté le 15-02-2005 à 19:35:41  profilanswer
 

Ah ok... Bizarre bizarre :??: Faudrait quelqu'un qui utilise xerces alors :D

n°982687
Filoche1
Posté le 15-02-2005 à 19:56:40  profilanswer
 

C'est le genre de bug que j'aime bien :/

n°982729
Filoche1
Posté le 15-02-2005 à 20:37:15  profilanswer
 

Pourtant selon http://www.cse.lehigh.edu/~heflin/ [...] ouble.html
 
Xerces est bien installé sur ma machine...
 
L'import ne fonctionne toujours pas :(
 
Well......

n°982889
Bufff
Posté le 15-02-2005 à 22:45:49  profilanswer
 

En passant par une DocumentBuilderFactory, ça doit être possible (non testé) :
 

Code :
  1. DocumentBuilderFactory factory = DocumentBuilderFactory.instance();
  2. factory.setIgnoringElementContentWhitespace(true);
  3. Document document = factory.newDocumentBuilder().parse(path);
  4. ...


 
En plus, en faisant comme ça, on reste indépendant du parser utilisé. Parce que :  
com.sun.org.apache.xerces.internal.parsers.DOMParser
ça me fait penser que ça n'est pas une classe qui est prévue pour être utilisée directement...

n°982920
FlorentG
Posté le 15-02-2005 à 23:03:44  profilanswer
 

C'est ce que j'ai pensé, tout ce qui a le mot "internal" n'est en général pas destiné à être utilisé en dehors :/

n°982923
benou
Posté le 15-02-2005 à 23:04:11  profilanswer
 

Bufff a écrit :

Parce que :  
com.sun.org.apache.xerces.internal.parsers.DOMParser
ça me fait penser que ça n'est pas une classe qui est prévue pour être utilisée directement...


carrément +1 !!! [:le kneu]
 
Filoche1> pourquoi tu ne testes pas le type de tes noeuds pour ne traiter que les noeuds de type ELEMENT_NODE ?

n°982940
Bufff
Posté le 15-02-2005 à 23:10:02  profilanswer
 

benou a écrit :

Filoche1> pourquoi tu ne testes pas le type de tes noeuds pour ne traiter que les noeuds de type ELEMENT_NODE ?


 
Peut-être parce qu'il y a aussi des noeuds texte qui sont importants? (en tout cas, dans son exemple, c'est le cas)

n°982945
Filoche1
Posté le 15-02-2005 à 23:11:14  profilanswer
 

Merci pour vos nombreuses réponses.
 
Voici mon code :
 
factory.setIgnoringElementContentWhitespace(true);  
   
   Document doc = factory.newDocumentBuilder().parse(path);  
   
   root = doc.getDocumentElement(); //Get the root element
   
   NodeList nl = doc.getElementsByTagName("message" );
   
   System.out.println(nl.getLength());
   
   System.out.println(nl.item(0).getChildNodes().getLength());
 
et mon fichier XML contient :
 
<message_list>
 <message>
  <sequence>1</sequence>
 </message>
</message_list>
 
Donc le premier print me donne : 1  (car j'ai juste 1 noeud "message"
 
Cependant le deuxième println me donne 3 (donc 3 fils pour le noeud message...ce qui est faux).
 
Je continus te chercher.
 
Sinon merci pour les explications concernant le parseur indépendant..Ca marche super bien.
 

n°982998
benou
Posté le 15-02-2005 à 23:28:04  profilanswer
 

mais nan, c'est normal !!! en Dom, du texte c'est un Node : http://java.sun.com/j2se/1.4.2/doc [...] /Node.html
 
à toi de trier parmis les noeuds ceux qui sont de type texte ou de type element (comme je le disais)
 

Bufff a écrit :

Peut-être parce qu'il y a aussi des noeuds texte qui sont importants? (en tout cas, dans son exemple, c'est le cas)


dans le cas d'un noeud de type texte, il peut toujours tester si le texte est blanc [:spamafote]
pas top mais bon ... :/

n°983013
Filoche1
Posté le 15-02-2005 à 23:31:53  profilanswer
 

Un gros merci pour les explications...
 
Okdoki then.  Je vais "parser" mes noeuds (il y a plusieurs du type text que je dois lire).  A chaque fois que je lis un noeud et si il est du type text alors je vais vérifier si il contient vraiment du text.
 
Je trouve que ca fait un peu tordu mais si c'est la seule solution :)
 

n°983014
Bufff
Posté le 15-02-2005 à 23:32:04  profilanswer
 

Je viens de relire la Javadoc de DocumentBuilderFactory, et effectivement, ça marche pas comme ça.

Citation :


Specifies that the parsers created by this factory must eliminate  whitespace in element content (sometimes known loosely as  'ignorable whitespace') when parsing XML documents (see XML Rec  2.10). Note that only whitespace which is directly contained within  element content that has an element only content model (see XML  Rec 3.2.1) will be eliminated. Due to reliance on the content model  this setting requires the parser to be in validating mode. By default  the value of this is set to false.


 
En clair, il faut que le parseur connaisse la structure du document (DTD ou Schema) pour savoir quels espaces sont non-significatifs (en y réfléchissant un peu, c'est parfaitement logique)
Donc 2 solutions : écrire une DTD (ou un schema), ou parser les noeuds texte


Message édité par Bufff le 15-02-2005 à 23:33:10
n°983020
benou
Posté le 15-02-2005 à 23:33:44  profilanswer
 

http://java.sun.com/j2se/1.4.2/doc [...] e(boolean)

Citation :

Specifies that the parsers created by this factory must eliminate whitespace in element content (sometimes known loosely as 'ignorable whitespace') when parsing XML documents (see XML Rec 2.10). Note that only whitespace which is directly contained within element content that has an element only content model (see XML Rec 3.2.1) will be eliminated. Due to reliance on the content model this setting requires the parser to be in validating mode. By default the value of this is set to false.


 
ca laisse suposer que si ton document XML n'a pas de DTD qui dit que les espaces sont "ignorables", ils ne seront pas ignoré même en mettant true à setIgnoringElementContentWhitespace
 
 
edit : grilled [:sisicaivrai]


Message édité par benou le 15-02-2005 à 23:34:09
n°983036
Filoche1
Posté le 15-02-2005 à 23:42:33  profilanswer
 

Wow merci les mecs.
 
Est-ce compliqué de spécifier (en utilisant DTD) que les espaces sont ignorables ? Je n'est jamais utilisé cela. Un exemple serait apprécié (si la syntaxe est simple.  Sinon j'étudirai un peu comment cela fonctionne.
 
Merci encore :)


Message édité par Filoche1 le 15-02-2005 à 23:43:27
n°983042
benou
Posté le 15-02-2005 à 23:55:01  profilanswer
 

suffit de dire que ton élément contient uniquement d'autres éléments et pas de PCDATA ...
 
cherche un tuto rapide sur les DTD

n°983046
Filoche1
Posté le 15-02-2005 à 23:58:39  profilanswer
 

Parfait alors. Je vais aller faire mes devoirs :)
 
http://www.w3schools.com/dtd/dtd_intro.asp (pour les intéressés)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  DOMParser et problème avec noeud bidon

 

Sujets relatifs
Problème Requete avec sélection par annéeprobleme isset() avec index.php
Problème de mise en forme. forum en phpbbProblème de template? (encore)
probleme d'installation TomcatProblème avec pointeur dans une structure
problème après compilation...Probleme avec structure
Problème XHTML/CSSProblème texte dynamique
Plus de sujets relatifs à : DOMParser et problème avec noeud bidon


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR