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 :

Construction d'un document à partir d'une chaîne de caractères [SAX]


Sujet :

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

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Par défaut Construction d'un document à partir d'une chaîne de caractères
    Bonjour,

    je teste actuellement un script qui transforme des données récupérées en JSON vers du XML (ça, ça marche).
    Voici le XML tel que je le récupère :

    myFile.xml

    J'ai donc réalisé le bout de code suivant pour essayer de retourner le statut d'un moniteur en fonction du nom passé en paramètre :

    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
     
    // Permet de transformer le JSON en XML
    	public String getMonitorStatus(String s) {
    		String sStatus = "";
    		JSONObject json = new JSONObject(getJSONFromDatametrie());
    		org.jdom2.Document document;
    		Element racine;
     
    		// Conversion en XML
    		try {
    			String sXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + XML.toString(json);
    			//DEBUG
    			System.out.println(sXml);
    			// création d'un saxbuilder pour parcourir le xml
    			SAXBuilder sxb = new SAXBuilder();
    			//InputStream stream = new ByteArrayInputStream(sXml.getBytes("UTF-8"));
    			document = sxb.build(new StringReader(sXml));
    			// on se place à la balise racine
    			racine = document.getRootElement();
    			// création d'une liste puis d'un objet pour chaque item de type response qu'on retrouve
    			List listReponse = racine.getChildren("response");
    			System.out.println("Taille de la liste response : " + listReponse.size());
    			Iterator i = listReponse.iterator();
    			while (i.hasNext()) {
    				Element courant = (Element)i.next();
    				System.out.println("Element courant : " + courant.getChild("MONITOR_ID").getText());
    				if (getMonitorName(Integer.parseInt(courant.getChild("MONITOR_ID").getText())) == s)
    					sStatus = courant.getChild("ALARM_TYPE").getText();
    			}
    		}
    		catch (JSONException e) { 
    			e.printStackTrace();
    		}
    		catch (IOException e) {
    			e.printStackTrace();
    		}
    		catch (JDOMException e) {
    			e.printStackTrace();
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		return sStatus;
    	}
    Or, mon problème est qu'après debug je vois que le nombre d'éléments retournés par la méthode listReponse.size() est égal à 0 (il n'y a donc pas d'éléments retournés pour l'élement enfant réponse alors qu'il y en a plein dans mon XML)

    Y a t'il quelque chose que je fais mal ? Je débute en Java, je précise
    Merci à vous !

  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
    Hello,

    l'élément racine dans ton fichier c'est <Ipln> et non pas <Get_Status_All_Monitors>.
    <Ipln> n'a pas de fils <response>, d'où taille zéro.

    Cela dit, avec JDOM et Java 1.8, cela peut être codé de manière un peu plus directe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    return document.getRootElement()
      .getChild("Get_Status_All_Monitors") // passer à l'élément qui contient <response>
      .getChildren("response")             // prendre la liste des responses
      .stream()                            // transformer en stream pour la suite
      .filter(e -> getMonitorName(Integer.parseInt(e.getChildText("MONITOR_ID"))).equals(s)) // ne garder que les <response> dont le MONITOR_ID correspond
      .findFirst().get()                   // prendre le premier de ces <response>
      .getChildText("ALARM_TYPE");         // extraire le ALARM_TYPE
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2016
    Messages : 8
    Par défaut
    Ah merci j'avais mal compris comment fonctionnait les getChild() et getChildren() d'où le souci...

    Ça fonctionne parfaitement, je passe le sujet en résolu, merci beaucoup !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/06/2013, 22h57
  2. Réponses: 6
    Dernier message: 27/06/2007, 10h33
  3. importer module à partir d'une chaîne de caractères
    Par j_p_g dans le forum Général Python
    Réponses: 2
    Dernier message: 23/04/2007, 15h15
  4. Réponses: 21
    Dernier message: 22/06/2006, 21h11
  5. Réponses: 8
    Dernier message: 16/06/2006, 01h06

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