DOMParser et problème avec noeud bidon

DOMParser et problème avec noeud bidon - Java - Programmation

Marsh Posté le 15-02-2005 à 16:40:00    

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.

Reply

Marsh Posté le 15-02-2005 à 16:40:00   

Reply

Marsh Posté le 15-02-2005 à 16:40:52    

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

Reply

Marsh Posté le 15-02-2005 à 16:43:58    

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

Reply

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

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!
 
 

Reply

Marsh Posté le 15-02-2005 à 19:10:29    

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

Reply

Marsh Posté le 15-02-2005 à 19:13:15    

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

Reply

Marsh Posté le 15-02-2005 à 19:14:31    

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

Reply

Marsh Posté le 15-02-2005 à 19:23:49    

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 ?

Reply

Marsh Posté le 15-02-2005 à 19:25:49    

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);    
       
             
  }

Reply

Marsh Posté le 15-02-2005 à 19:26:08    

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
Reply

Marsh Posté le 15-02-2005 à 19:26:08   

Reply

Marsh Posté le 15-02-2005 à 19:26:55    

Et y'a bien la fonction setIncludeIgnorableWhitespace

Reply

Marsh Posté le 15-02-2005 à 19:29:04    

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

Reply

Marsh Posté le 15-02-2005 à 19:30:04    

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

Reply

Marsh Posté le 15-02-2005 à 19:32:46    

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;  

Reply

Marsh Posté le 15-02-2005 à 19:35:41    

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

Reply

Marsh Posté le 15-02-2005 à 19:56:40    

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

Reply

Marsh Posté le 15-02-2005 à 20:37:15    

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

Reply

Marsh Posté le 15-02-2005 à 22:45:49    

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...

Reply

Marsh Posté le 15-02-2005 à 23:03:44    

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 :/

Reply

Marsh Posté le 15-02-2005 à 23:04:11    

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 ?

Reply

Marsh Posté le 15-02-2005 à 23:10:02    

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)

Reply

Marsh Posté le 15-02-2005 à 23:11:14    

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.
 

Reply

Marsh Posté le 15-02-2005 à 23:28:04    

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 ... :/

Reply

Marsh Posté le 15-02-2005 à 23:31:53    

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 :)
 

Reply

Marsh Posté le 15-02-2005 à 23:32:04    

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
Reply

Marsh Posté le 15-02-2005 à 23:33:44    

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
Reply

Marsh Posté le 15-02-2005 à 23:42:33    

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
Reply

Marsh Posté le 15-02-2005 à 23:55:01    

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

Reply

Marsh Posté le 15-02-2005 à 23:58:39    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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