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 :

Débutant - lire xml


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut Débutant - lire xml
    Bonjour,

    Je fais un POST avec un fichier xml (que je contruit "à la main") sur un site web avec une requete de prix et disponibilité d'un produit. Je reçois un fichier xml en réponse que je dois lire pour en extraire les données.

    Le but final est de mettre à jour une base de base de données avec les données récupérées dans l'xml.

    Je viens de passer des heures à lire différentes faq et tutoriels sur le sujet mais je suis assez perdu et je ne sais pas quoi faire...

    Voici un fichier xml de réponse :

    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
    <PNAResponse>
    <Version>2.0</Version>
    <TransactionHeader>
    <SenderID>987654321</SenderID>
    <ReceiverID>123456789</ReceiverID>
    <ErrorStatus ErrorNumber=""></ErrorStatus>
    <DocumentID>{05BA5133-D4A2-49CA-82C2-B098583318E7}</DocumentID>
    <TransactionID>54321</TransactionID>
    <TimeStamp>2009-05-13T11:29:58</TimeStamp>
    </TransactionHeader>
    <PriceAndAvailability SKU="123P090" Quantity="1">
    <Price>1234,56</Price>
    <SpecialPriceFlag></SpecialPriceFlag>
    <ManufacturerPartNumber>LX.ASZ0X.153</ManufacturerPartNumber>
    <ManufacturerPartNumberOccurs></ManufacturerPartNumberOccurs>
    <VendorNumber>B722</VendorNumber>
    <Description>ASPIRE 8930G-644G50BN C2</Description>
    <ReserveInventoryFlag>N</ReserveInventoryFlag>
    <AvailableRebQty>0</AvailableRebQty>
    <Branch ID="50" Name="Warehouse 1">
    <Availability>12</Availability>
    <OnOrder>0</OnOrder>
    <ETADate>2009-05-19</ETADate>
    </Branch>
    <UPC>4712842582861</UPC>
    <CustomerPartNumber></CustomerPartNumber>
    <VendorPartNumber>LX.ASZ0X.153</VendorPartNumber>
    <ServiceFee>
    <Fees>
    <Code>881</Code>
    <Description>RECUPEL RECYCLING FEE</Description>
    <Amount>0.04130000</Amount>
    </Fees>
    <Fees>
    <Code>882</Code>
    <Description>BEBAT BATTERY FEE</Description>
    <Amount>0.24780000</Amount>
    </Fees>
    </ServiceFee>
    </PriceAndAvailability>
    </PNAResponse>
    J'aimerais faire une méthode pour pouvoir extraire la donnée de mon choix (price, SKU, VendorPartNumber, ...)

    Comment recuperer plusieurs "Fees" dans une liste par exemple ?

    Dans le futur je devrais aussi envoyer des xml de commandes de produits vers le même site web.

    Merci de m'aider.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Par défaut
    Bonjour,
    Plusieurs solutions

    Solution 1:
    Avec une API parser SAX(ou sTAX), tu lis ton flux XML et tu l'enregistres dans une structure objet (Cette structure est à créer, dépend des informations du flux XML dont tu as besoin [et si tu as besoin de tout, JAXB ?]).
    Tu peux ensuite manipuler ces objets.
    Solution 2:
    Tu construit un objet DOM (import org.w3c.dom), et tu le parcours (puis idem 1).
    Solution 3:
    Tu construit un objet DOM, puis tu utilise des requete grace à une API XPath.
    Les requetes XPath te permettent de récupérer ou plusieurs noeud.

    te renverra le noeud PriceAndAvailability tel que l'attribut SKU soit respécté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //PriceAndAvailability/price
    te renverra la liste des noeud price (si tu peux avoir plusieurs PriceAndAvailability dans un même xml- cf le XSD)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //PriceAndAvailability[@SKU='123P090']/ServiceFee/Fees
    renvoie une liste de noeuds (de 2 élements).


    Remarque:
    Le DOM pénalisera plus tes temps de traitement, de même pour les api XPath
    mais ca peut être plus simple pour commencer.
    Il n'empeche que dans ton cas la 1ere étape est de trouver les éléments à récupérer et les différentes occurrences.

    Avec l'API SAX, tu ne pourras pas créer des fichiers.(donc vaut peut être mieux apprendre que le DOM dans 1er temps)

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut
    Merci de la réponse mais j'ai trouvé une méthode bien plus satisfaisante...

    J'espère que cela servira à d'autres. Voici comment je suis arrivé à la résolution de mon problème.

    Etape 1 : Lecture avec attention du tutoriel de sun sur les Web Services, Sun y parle d'un outil génial : xjc. Cet outil permet de générer les classes Java correspondantes à un schema XML au format XSD.

    Etape 2 : Créer le fichier schema XML au format XSD pour le donner à xjc. 2 façons possibles. L'écrire soit même ou trouver un générateur/convertisseur. Et j'ai trouvé l'outil Trang qui convertit un fichier XML (dans mon cas un fichier PNAResponse.xml) en schema XSD que donne ensuite à xjc pour qu'il me génere les classes Java correspondantes.

    Et ça fonctionne vraiment très bien.

    Mais attention, Trang se base forcement sur ce qu'il trouve dans le fichier XML pour créer le schema donc il faut veiller à avoir un XML vraiment complet.

    De plus, il faut quand faire quelques corrections dans le fichier XSD généré par Trang, par exemple la vérification du type de certain élément. Un élément date (ETADate) a été traduit en objet ETADate inutilisable.

    J'ai donc demander à mon fournisseur les schemas au format XSD...j'espère les avoir sinon il me faudra convertir et corriger...

    Ci-joint quelques fichiers d'exemple.

    Si quelqu'un connait un meilleur outil que Trang ?

    A+
    Fichiers attachés Fichiers attachés

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut
    J'avais oublier le code d'utilisation des classes générées

    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
            JAXBContext jc = JAXBContext.newInstance("XML.IngramMicro.PNAResponse");
            Unmarshaller unmarshaller = jc.createUnmarshaller();
     
            PNAResponse pna = (PNAResponse) unmarshaller.unmarshal(new File("d:\\PNAResponseTest.xml"));
     
            TransactionHeader tr = pna.getTransactionHeader();
            System.out.println("             TimeStamp = " + tr.getTimeStamp());
            System.out.println("                 Error = " + tr.getErrorStatus().getErrorNumber());
            System.out.println("");
     
            List pnaList = pna.getPriceAndAvailability();
            Iterator itPnaList = pnaList.iterator();
            while  ( itPnaList.hasNext (  )  )   {
                PriceAndAvailability p = (PriceAndAvailability) itPnaList.next();
     
                System.out.println("           Description = " + p.getDescription());
                System.out.println("                   SKU = " + p.getSKU());
                System.out.println("                 Price = " + p.getPrice());
                System.out.println("              Quantity = " + p.getQuantity());
                System.out.println("ManufacturerPartNumber = " + p.getManufacturerPartNumber());
                System.out.println("          VendorNumber = " + p.getVendorNumber());
                System.out.println("       AvailableRebQty = " + p.getAvailableRebQty());
     
                System.out.println("Branch : ");
     
                // liste des branch
                List branchList = p.getBranch();
                Iterator itBranch = branchList.iterator();
                while  ( itBranch.hasNext (  )  )   {
                    Branch b =  (Branch) itBranch.next();
                    System.out.println("          Availability = " + b.getAvailability());
                    System.out.println("               OnOrder = " + b.getOnOrder());
                    System.out.println("               ETADate = " + b.getETADate());
                }
     
                // liste des fees
                if(p.getServiceFee()!=null){
                    System.out.println("ServiceFees : ");
                    List feesList = p.getServiceFee().getFees();
                    Iterator itFees = feesList.iterator();
                    while  ( itFees.hasNext (  )  )   {
                        Fees f = (Fees) itFees.next();
                        System.out.println ("Code = " + f.getCode() + " --- Descript = " + f.getDescription() + " --- Amount = " + f.getAmount()) ;
                    }
                }
                System.out.println("*********************************************************************************************");
            }

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

Discussions similaires

  1. [XPATH] Débutant - Lire XML avec xpath
    Par LostRailler dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 09/06/2009, 17h08
  2. (Débutant) Lire un fichier Xml
    Par Zikas-r dans le forum C#
    Réponses: 9
    Dernier message: 24/12/2007, 23h31
  3. Lire XML avec ASP
    Par Tops dans le forum ASP
    Réponses: 4
    Dernier message: 04/04/2005, 15h40
  4. Réponses: 1
    Dernier message: 24/11/2004, 16h54
  5. [Débutant] Lecture xml SAX
    Par Ekros dans le forum APIs
    Réponses: 6
    Dernier message: 21/06/2004, 15h14

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