Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > APIs
APIs DOM, SAX, JAXP,STAX... leur fonctionnement, leurs implémentations Avant de poster -> FAQ XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/05/2010, 01h45   #1
imen1986
Invité de passage
 
Inscription : juillet 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 39
Points : 4
Points : 4
Par défaut Problème parcours fichier xml.

Bonjour,
Est-ce-que quelqu'un peut m'aider. je veut parcourir une fichier XML. Le problème est que mon code avec du xml simple comme :
Code :
1
2
3
4
5
6
 
<titi>
   <tata>
          <toto>zen</toto>
   </tata>
</titi>
fonctionne.
Alors que si j'ajoute dans les nœuds certain attributs comme eanucc:,sh: comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
<sh:titi>
   <sh:tata>
          <sh:toto>zen</sh:toto>
   </sh:tata>
</sh:titi>
<eanucc:titi>
   <eanucc:tata>
          <eanucc:toto>zen</eanucc:toto>
   </eanucc:tata>
</eanucc:titi>
mon code ne fonctionne plus. j'arrive pas à récupérer des données. Et rien n'est affiché en exécution. Seulement un espace vide.
j'utilise Xpath pour parcourir mon XML.
Merci d'avance pour tout aide.
imen1986 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2010, 03h07   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 285
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 285
Points : 10 610
Points : 10 610
Envoyer un message via Skype™ à thelvin
Ces choses ne sont pas des attributs mais des préfixes. Les préfixes servent à placer l'élément qu'ils préfixent dans un namespace.

C'est à ça qu'ils servent. Ils doivent être utilisés pour ça et en aucun autre cas. Si tu déroges à cette règle, xPath, XSL et un bon paquet d'outils ne fonctionneront pas.
Ton exemple ne peut pas marcher car il est invalide avec les namespaces : tes préfixes n'ont pas été associés à un namespace avec xmlns.

Renseigne-toi sur les namespaces en XML, et normalement tu devrais comprendre, ce qui n'allait pas, ce qu'il faut faire pour que ça aille, et comment réparer tes xPath.
thelvin est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2010, 10h34   #3
polymorphisme
Modérateur
 
Avatar de polymorphisme
 
Homme Grégory Roche
Publishing
Inscription : octobre 2009
Messages : 1 424
Détails du profil
Informations personnelles :
Nom : Homme Grégory Roche
Âge : 39
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Publishing

Informations forums :
Inscription : octobre 2009
Messages : 1 424
Points : 2 333
Points : 2 333
Bonjour,

après t'être documenter, par exemple en consultant la fac,
tu doit obtenir un code similaire à :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
 
<root 
  xmlns:sh="http://host.domain.tdl/ns/sh"
  xmlns:eanucc="http://host.domain.tdl/ns/eanucc">
 
<sh:titi>
   <sh:tata>
          <sh:toto>zen</sh:toto>
   </sh:tata>
</sh:titi>
<eanucc:titi>
   <eanucc:tata>
          <eanucc:toto>zen</eanucc:toto>
   </eanucc:tata>
</eanucc:titi>
 
</root>
__________________
Article : Installation de Cocoon
Je ne réponds pas aux MP à caractère technique.
polymorphisme est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2010, 10h57   #4
imen1986
Invité de passage
 
Inscription : juillet 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 39
Points : 4
Points : 4
Bonjour;
Merci bien pour vos réponses.
Mais je veux ajouter que mon XML est prédéfinit et je peu pas le changer. Je doit chercher à le parcourir sans ajouter ou éliminer quelque chose. je voit pa donc que voulait dire polymorphisme par "tu doit obtenir un code similaire"
imen1986 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2010, 13h55   #5
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 285
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 285
Points : 10 610
Points : 10 610
Envoyer un message via Skype™ à thelvin
Il veut dire que les préfixes doivent être déclarés avec la construction xmlns:prefixe comme il l'a montré dans son exemple.

Il est très probable que le XML qu'on te fournit a des déclarations de ce genre. Si ce n'est pas le cas, alors il est assez mal fichu et ça va être compliqué de s'en servir.

Mais cherche pas, tu dois d'abord apprendre à te familiariser avec les namespaces et les préfixes en XML. Sans une certaine compréhension de la chose, on ne peut pas se poser les bonnes questions.
thelvin est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2010, 20h46   #6
imen1986
Invité de passage
 
Inscription : juillet 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 39
Points : 4
Points : 4
Bonjour thelvin ,
Je cherché dans le net. Alors ma compréhension du fonctionnement des namespace ne m'a pas beaucoup aidé à trouver le bon chemin à fournir dans Xpath afin de récupérer des données.
alors si vous connaissez un site ou une ressource qui peut m'aider je serai très reconnaissante.
Merci d'avance.
imen1986 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2010, 22h59   #7
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 285
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 285
Points : 10 610
Points : 10 610
Envoyer un message via Skype™ à thelvin
Normalement tu as maintenant compris qu'il faut :
- Déclarer les namespaces et les associer à un préfixe.
- Utiliser le préfixe en question devant le nom de l'élément.

En xPath, il s'agit donc de préfixer les éléments tout pareil. Les différences :

- Il n'y a pas de "namespace par défaut" en xPath. Si on ne met pas de préfixe, c'est que l'élément n'est pas dans un namespace. Autrement dit, si l'élément est dans un namespace, alors il doit être préfixé, un point c'est tout.
- Les préfixes doivent être déclarés en dehors de l'expression xPath. Où, ça dépend de la technologie utilisée. En XSLT, il suffit de déclarer les préfixes à la racine de la stylesheet, et ils seront utilisables dans les expressions xPath.
thelvin est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2010, 00h19   #8
imen1986
Invité de passage
 
Inscription : juillet 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 39
Points : 4
Points : 4
Merci Thelvin;
je vous donne mon code afin que tu me comprend mieux. Voici mon XML
Code :
1
2
3
4
5
6
7
8
9
10
11
 
<sh:StandardDocument xmlns:sh="http://www.unece.org/cefact/namespaces/StandardDocumentHeader" xmlns:eanucc="urn:ean.ucc:2"
 
<sh:StandardumentHeader>
		<sh:Sender> "eeeee"</sh:Sender>
		<sh:Receiver>"ffff"  </sh:Receiver>	
</sh:StandardDocumentHeader>
<eanucc:message>
       <Identifier> "hhhh"<Identifier>
</eanucc:message>
<sh:StandardDocument>
Ma classe est la suivante
Code :
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
 
public class ssessai{
 
 
public static String evaluerSAX(File file, String expression, QName retour) throws FileNotFoundException, XPathExpressionException{
 
 
 
	InputSource source = new InputSource(new FileInputStream(file));
 
 
			XPathFactory fabrique = XPathFactory.newInstance();
			XPath xpath = fabrique.newXPath();
			XPathExpression exp = xpath.compile(expression);
			Object resultat = exp.evaluate(source,retour);
			System.out.println(resultat);
			String value = resultat.toString();
                        return (value);	
	}
	public static void main(String[] args){
 
		try{
 
      File xml = new File("templates/document.xml");
 
      String id = evaluerSAX(xml, "eanucc:message/Identifier", XPathConstants.STRING);
 
		}catch(Exception e){
			e.printStackTrace();	
		}
	}	
}
Quand j'exécute mon code, il ne me retourne aucune erreur. Mais à la place de id il me retourne un espace vide. Alors si préfixer l'élément se fait comme j'ai fait, elle est où l'erreur.
Merci
imen1986 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2010, 01h03   #9
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 285
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 285
Points : 10 610
Points : 10 610
Envoyer un message via Skype™ à thelvin
Citation:
Envoyé par imen1986 Voir le message
Quand j'exécute mon code, il ne me retourne aucune erreur.
Il devrait : eanucc n'a pas été déclaré.

Citation:
Envoyé par imen1986 Voir le message
Alors si préfixer l'élément se fait comme j'ai fait, elle est où l'erreur.
Tu n'as pas déclaré le préfixe eanucc.
Arrivé à ce point-là tu devrais te rendre compte que tu n'as jamais eu l'occasion de le faire, et que c'est un problème puisque c'est obligatoire, non ?

Cela se fait avec la méthode XPath.setNamespaceContext(). Il faut définir une classe qui implémente NamespaceContext et indique les namespaces à déclarer.

(Note : utiliser JDOM est beaucoup plus facile que juste le DOM de Java.)
thelvin est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2010, 01h34   #10
imen1986
Invité de passage
 
Inscription : juillet 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 39
Points : 4
Points : 4
Ok merci beaucoup pour toute les informations Thelvin.
imen1986 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h47.


 
 
 
 
Partenaires

Hébergement Web