IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

erreur cast d'un type Node à Element [DOM]


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Par défaut erreur cast d'un type Node à Element
    Bonjour,

    Je cherche à parcourir un document xml et j'ai des balises du genre
    <Field Name="toto" type="string">
    <![CDATA[titit tutu]]>
    </Field>

    Et j'essaye de passer par le cast d'un type Node à un type Element, mais j'arrive à chaque à cette erreur.

    java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTex
    tImpl cannot be cast to org.w3c.dom.Element

    Voici l'exemple du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    ...
    if (document != null) {
    			/*Liste items */
    			NodeList items = document.getElementsByTagName("ITEMS");
    			if (items != null && items.getLength() > 0) {
    				/*parcours de la liste des items*/
    				for (int i = 0; i < items.getLength(); i++) {
    					Node itemList = items.item(i);
    					
    					
    					System.out.println("1 "+itemList.getNodeName());
    					NodeList item = itemList.getChildNodes();
    				
    					/*parcours des contenus d'un item*/
    					for (int j = 0; j < item.getLength(); j++) {
    						/*on récupère une liste de fields*/
    						Node fields = item.item(j);
    						
    						
    						System.out.println("2 "+fields.getNodeName());
    						System.out.println("type = "+fields.getNodeType());
    						/*Element link = (Element) fields;
    						System.out.println(link.getAttribute("ID"));
    						System.out.println(link.getAttribute("Title"));
    						*/
    						NodeList fieldList = fields.getChildNodes();
    						
    						for (int k = 0; k < fieldList.getLength(); k++) {
    							Node field = fieldList.item(k);
    							System.out.println("3 "+field.getNodeName());
    							
    							NodeList children = field.getChildNodes();
    							
    							/*parcours de field*/
    							for (int l = 0; l < children.getLength(); l++) {
    								Node child = children.item(l);
    								Element link = (Element) child;
    								
    								System.out.println("4 "+child.getNodeName());
    								
    								System.out.println(child.getTextContent());
    								System.out.println("type = "+child.getNodeType());
    							}
    						}
    					}
    
    				}
    			
    			}
    		}
    ...
    Voici un extrait du fichier xml que je parcours pour importer les données se trouvant dans les balises field.

    Le problème est que je n'arrive pas à récupérer la valeur du Name dans le
    <Field Name="toto" type="string">
    <![CDATA[titit tutu]]>
    </Field>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    <?xml version="1.0" encoding="utf-8"?>
    <LISTS>
      <LIST Name="offres_emploi" Url="http://universalis...">
        <ITEMS>
     
          <ITEM Title="technicien station" ID="{...}">
            <FIELDS>
    		  <FIELD Name="Title" type="string"><![CDATA[technicien station]]></FIELD>
     
              <FIELD Name="piecejointe" type="document"><![CDATA[{identifiant_doc_1}]]></FIELD>
            </FIELDS>
          </ITEM>
     
        </ITEMS>
      </LIST>
      <LIST Name="library" Url="http://.....">
        <DOCUMENTS>
          <DOCUMENT Name="offre_technicien.pdf" ID="{identifiant_doc_1}">
            <FIELDS>
              <FIELD Name="name" type="string"><![CDATA[description de l'offre]]></FIELD>
              <FIELD Name="description" type="string"><![CDATA[]]></FIELD>
              <FIELD Name="type" type="string"><![CDATA[Document]]></FIELD>
            </FIELDS>
          </DOCUMENT>
     
        </DOCUMENTS>
      </LIST>
    </LISTS>
    Merci d'avance pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    C'est un nœud CDATA, tu sais. Rien d'étonnant à ce que tu ne puisses pas le caster en Element.

    Le plus simple est de faire directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    field.getTextContent();
    Il sert à ça, au fond.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Par défaut
    Merci pour ta réponse.

    Au fait ce que je voulais, c'était que dans
    <Field Name="toto" type="string">
    <![CDATA[titit tutu]]>
    </Field>
    .

    Je puisse récupérer la valeur de Name qui est toto dans la balise field.
    C'est pour ensuite l'utiliser pour faire le mapping entre le champ à insérer et la base de données. C'est ce qui me bloque, je ne sais pas vraiment comment faire récupérer la valeur de Name.

    Le field.getTextContent() récupère la valeur dans la balise soit le titi tutu

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ah !

    Bon, ben name est un attribut. Il faut appeler getAttribute("Name"). Cette méthode n'est implémentée que par Element, du coup c'est field qu'il faut caster en Element.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Element eField = (Element)field;
    String name = eField.getAttribute("Name");
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Par défaut
    Merci pour ta réponse.

    J'ai renommé un peu mes champs pour qu'ils correspondent au bon ordre des balises du XML. Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    if (document != null) {
    			/*Liste items */
    			NodeList itemsList =    document.getElementsByTagName("ITEMS");
    			if (itemsList != null && itemsList.getLength() > 0) {
    				/*parcours de la liste des items*/
    				for (int i = 0; i < itemsList.getLength(); i++) {
    					Node items = itemsList.item(i);
     
    					System.out.println("1 "+items.getNodeName());
    					NodeList itemList = items.getChildNodes();
     
    					/*parcours des contenus d'un item*/
    					for (int j = 0; j < itemList.getLength(); j++) {
    						/*on récupère une liste de fields*/
    						Node item = itemList.item(j);
     
    						System.out.println("2 "+item.getNodeName());
    						NodeList fieldsList = item.getChildNodes();
     
    						for (int k = 0; k < fieldsList.getLength(); k++) {
    							Node fields = fieldsList.item(k);
    							System.out.println("3 "+fields.getNodeName());
    							//Element link = (Element) fields;
    							//System.out.println("Attribute Name = " + link.getAttribute("Name"));
    							NodeList fieldList = fields.getChildNodes();
     
    							/*parcours de field*/
    							for (int l = 0; l < fieldList.getLength(); l++) {
    								Node field = fieldList.item(l);
     
    								System.out.println("4 "+field.getNodeName());
    								System.out.println("4 TextContent = " + field.getTextContent());
    							}
    						}
    					}
     
    				}
     
    			}
    		}
    Voici l'affichage de debug que je fais (sans le code avec Element) sur la console par rapport à mon xml:
    1 ITEMS
    2 #text
    2 ITEM
    3 #text
    3 FIELDS
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = technicien station
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = XE12
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = 12/12/2010T00:00:00Z
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = CDI
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = 81
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = Poste de technicien grandes cultures
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = 12/12/2010T00:00:00Z
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent =
    4 #text
    4 TextContent =

    4 FIELD
    4 TextContent = {identifiant_doc_1}
    4 #text
    4 TextContent =

    3 #text
    2 #text
    quand je mets ce code
    Element eField = (Element)field;
    String name = eField.getAttribute("Name");
    dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    for (int k = 0; k < fieldsList.getLength(); k++) {
    							Node fields = fieldsList.item(k);
    							System.out.println("3 "+fields.getNodeName());
    							//Element link = (Element) fields;
    							//System.out.println("Attribute Name = " + link.getAttribute("Name"));
    							NodeList fieldList = fields.getChildNodes();
     
    							/*parcours de field*/
    							for (int l = 0; l < fieldList.getLength(); l++) {
    								Node field = fieldList.item(l);
     
    								System.out.println("4 "+field.getNodeName());
    								System.out.println("4 TextContent = " + field.getTextContent());
     
    								Element eField = (Element)field;
    								String name = eField.getAttribute("Name");
    							}
    						}
    Je me retrouve avec l'erreur
    java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTex
    tImpl cannot be cast to org.w3c.dom.Element
    Voici mon fichier xml en intégralité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?xml version="1.0" encoding="utf-8"?>
    <LISTS>
      <LIST Name="offres_emploi" Url="http://universalis...">
        <ITEMS>
          <ITEM Title="technicien station" ID="{...}">
            <FIELDS>
    		  <FIELD Name="Title" type="string"><![CDATA[technicien station]]></FIELD>
    		  <FIELD Name="Field_Reference_Universalis" type="string"><![CDATA[XE12]]></FIELD>
              <FIELD Name="Field_DateOffre_Universalis" type="string"><![CDATA[12/12/2010T00:00:00Z]]></FIELD>
    		  <FIELD Name="Field_TypeOffre_Universalis" type="string"><![CDATA[CDI]]></FIELD>
              <FIELD Name="Field_DepartementTaxHTField0" type="string"><![CDATA[81]]></FIELD>
    		  <FIELD Name="Field_Description_Universalis" type="string"><![CDATA[Poste de technicien grandes cultures]]></FIELD> 
              <FIELD Name="Field_DateDebutContrat_Universalis" type="datetime"><![CDATA[12/12/2010T00:00:00Z]]></FIELD>
              <FIELD Name="Field_Duree_Universalis" type="string"><![CDATA[]]></FIELD>
              <FIELD Name="Field_piecejointe_Universalis" type="document"><![CDATA[{identifiant_doc_1}]]></FIELD>
            </FIELDS>
          </ITEM>
     
        </ITEMS>
      </LIST>
      <LIST Name="MyLibrary" Url="http://universalis...">
        <DOCUMENTS>
          <DOCUMENT Name="offre_technicien.pdf" ID="{identifiant_doc_1}">
            <FIELDS>
              <FIELD Name="name" type="string"><![CDATA[description de l'offre]]></FIELD>
              <FIELD Name="description" type="string"><![CDATA[]]></FIELD>
              <FIELD Name="type" type="string"><![CDATA[Document]]></FIELD>
            </FIELDS>
          </DOCUMENT>
     
        </DOCUMENTS>
      </LIST>
    </LISTS>
    J'ai toujours cette erreur qui m'empêche de récupérer mon attribut de Name

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Avec ça

    NodeList fieldList = fields.getChildNodes();


    et comme le montre votre sortie de debug, vosu allez non seulement récupérer les balise <field> qui se trouvent dans <fields>, mais vous allez aussi récupérer les noeud de type text qui l'entourent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    3 FIELDS
    4 #text <-- ceci est un enfant qui n'est pas un Element
    4 TextContent =
     
    4 FIELD
    4 TextContent = technicien station
    4 #text <-- ceci est un enfant qui n'est pas un Element
    4 TextContent =
    vous devriez adapter votre code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    							/*parcours de field*/
    							for (int l = 0; l < fieldList.getLength(); l++) {
    								Node field = fieldList.item(l);
    								if (field.getNodeType()!=Node.ELEMENT_NODE)
    								    continue; // ne pas traiter
     
    								System.out.println("4 "+field.getNodeName());
    								System.out.println("4 TextContent = " + field.getTextContent());
     
    								Element eField = (Element)field;
    								String name = eField.getAttribute("Name");
    							}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/10/2011, 23h55
  2. Réponses: 11
    Dernier message: 06/05/2009, 17h13
  3. [InputStream]erreur cast
    Par alex'l dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 22/09/2005, 11h02
  4. Erreur de conversion de type Null en String
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/07/2005, 15h25
  5. [héritage] cast avec le type de base
    Par Lere dans le forum C++
    Réponses: 6
    Dernier message: 16/09/2004, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo