DOMParser et problème avec noeud bidon - Java - Programmation
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"
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
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!
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
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...
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 ?
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 ?
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);
}
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 |
Marsh Posté le 15-02-2005 à 19:30:04
Possible, et donc avec org.apache.xerces.parsers.DOMParser, ça donne quoi ?
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;
Marsh Posté le 15-02-2005 à 19:35:41
Ah ok... Bizarre bizarre Faudrait quelqu'un qui utilise xerces alors
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......
Marsh Posté le 15-02-2005 à 22:45:49
En passant par une DocumentBuilderFactory, ça doit être possible (non testé) :
Code :
|
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...
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
Marsh Posté le 15-02-2005 à 23:04:11
Bufff a écrit : Parce que : |
carrément +1 !!!
Filoche1> pourquoi tu ne testes pas le type de tes noeuds pour ne traiter que les noeuds de type ELEMENT_NODE ?
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)
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.
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
pas top mais bon ...
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
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 : |
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
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
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
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
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)
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.