PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → les fichiers XML
les fichiers XML
Débuté par BUCAMP, 24 mai 2016 11:07 - 29 réponses
Posté le 24 mai 2016 - 11:07
Bonjour à tous,

Y aurait-il parmi vous, des personnes qui travaillent sur des fichiers XML afin d'en extraire les données ?

J'aurais besoin d'aide pour ce genre de travail.

Merci à tous pour votre aide.

F. BUCAMP
Posté le 24 mai 2016 - 11:41
Le 24/05/2016 à 09:07, BUCAMP a écrit :
Bonjour à tous,

Y aurait-il parmi vous, des personnes qui travaillent sur des fichiers
XML afin d'en extraire les données ?

J'aurais besoin d'aide pour ce genre de travail.

Merci à tous pour votre aide.

F. BUCAMP

Je travaille sur des Fichiers XML
Incorporation des fichiers XML des labos ... etc
C'est à voir quels genre de fichiers liste ou individuel
BOn windev
Membre enregistré
258 messages
Popularité : +35 (37 votes)
Posté le 24 mai 2016 - 12:11
Bonjour,

Voici un exemple de lecture de donnée :
// Chargement du code XML
SourceXML est une chaîne = fChargeTexte(Dossier_MAJ_Serveur+"\DATA_USER\COMMUN\WD53_BDD_Commande_en_retard.xml") // Charge le document
sMonDocXML = "XML"
XMLDocument(sMonDocXML, SourceXML) // Crée le document XML pour les manipulation dans Windev
XMLRacine(sMonDocXML) // Positionne sur l'élément "<RACINE>"
XMLFils(sMonDocXML) // Descend d'un niveau et positionne sur l'élément "<GRAPHIQUE>"
XMLFils(sMonDocXML) // Descend d'un niveau et positionne sur l'élément "<COMMANDE_RETARD_EXPEDITION>"
XMLFils(sMonDocXML) // Descend d'un niveau et positionne sur l'élément "<JOURS_MOIS>"
XMLDernier(sMonDocXML) // ce place au dernier enregistrement de "<JOURS_MOIS>" pour recuperer la derniere date de génération de l'état
nDerniere_date est un entier = XMLDonnée(sMonDocXML) // Recupere la valeur


Voici la syntaxe du fichier XML :




--
Baptiste CLOART
Consultant
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
Posté le 24 mai 2016 - 12:11
Merci pour votre aide.

Le fichier dont je dois extraire les données est un flux XML comportant les renseignements de chaque abonné au niveau de la consommation d'eau (code, nom, index lu, rue, etc...).

Pourriez-vous m'aider dans ce cas ?

Merci.

F. BUCAMP
Posté le 24 mai 2016 - 12:19
Merci pour l'aide.

Je dois récupérer les données de tous les abonnés consommant de l'eau.
Ainsi pour chaque abonné, je dois récupérer le code, les identités, le dernier index relevé par le portable.

Il faut donc que je lise le flux XML dans son intégralité et extraire les données de chaque abonné.

Pourriez-vous m'aider ?

Merci.

F. BUCAMP
Membre enregistré
258 messages
Popularité : +35 (37 votes)
Posté le 24 mai 2016 - 12:20
BUCAMP,

Avec l'exemple que je t'ai fourni sur mon dernier message tu a toute pour réussir ce que tu veux :merci:
Si tu souhaite une aide approfondi, tu peux m'envoyer un mail b.cloart@blv-tech.com

--
Baptiste CLOART
Consultant
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
Message modifié, 24 mai 2016 - 12:21
Membre enregistré
256 messages
Popularité : +29 (29 votes)
Posté le 24 mai 2016 - 14:40
Bonjour

Si le format du XML est fixe, il est également possible d'importer le fichier XML directement dans l'éditeur de WINDEV.
Les différents éléments du XML sont ensuite facilement utilisables avec coloration, assistance, ...
d est un XMLDocument = XMLOuvre("...")
Trace(d.racine.balise)
Posté le 24 mai 2016 - 16:20
Le 24/05/2016 à 10:11, BUCAMP a écrit :
Merci pour votre aide.

Le fichier dont je dois extraire les données est un flux XML comportant
les renseignements de chaque abonné au niveau de la consommation d'eau
(code, nom, index lu, rue, etc...).

Pourriez-vous m'aider dans ce cas ?

Merci.

F. BUCAMP

Transmettez moi une fois l'un de vos fichier mais il ne devrait pas y
avoir trop de problème
Posté le 25 mai 2016 - 11:57
Bonjour,

Le problème se pose car pour une balise, il existe plusieurs attributs.
Je ne peux pas (règle de confidentialité) ni donner un fichier ni l'écrire.

exemple :
- <Essai>
<sousessai1 Tol1="5" Tol2="4" Max1="200" Max2="150"

Comment lire l'un des attributs ?
Dans l'aide de PCSOFT, une balise n'a qu'un attribut.

Merci pour votre aide.

F. BUCAMP
Posté le 25 mai 2016 - 15:25
Bonjour,

Il est vrai que c'est plus facile mais comment parcourir ce flux XML pour extraire les données une à une pour les ajouter dans un fichier windev qui serait rempli au fur et à mesure de la lecture du flux XML ?
Les XMLPremier, XMLSUivant ne fonctionnent pas pour cela.

Y aurait-il une solution ?

Merci pour votre aide.

F. BUCAMP
Posté le 25 mai 2016 - 16:58
Bonjour

encore plus simple.

Tu importe le XML dans l'ANALYSE... et ensuite, hlitpremier/suivant

Cordialement

--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Plus d'information sur http://fabriceharari.com
Posté le 26 mai 2016 - 09:23
Le 25/05/2016 à 09:57, BUCAMP a écrit :
Bonjour,

Le problème se pose car pour une balise, il existe plusieurs attributs.
Je ne peux pas (règle de confidentialité) ni donner un fichier ni l'écrire.

exemple : - <Essai>
<sousessai1 Tol1="5" Tol2="4" Max1="200" Max2="150"

Comment lire l'un des attributs ?
Dans l'aide de PCSOFT, une balise n'a qu'un attribut.

Merci pour votre aide.

F. BUCAMP


Pour ma part j'ai été confronté à ce problème
Tu dois prendre ta Balise et lire le contenu
ici table ajouteligne...
chez toi tu remplis ton champs désolé pour les espacements

XMLRacine("CMONDOC")
XMLRecherche("CMONDOC","Patient")
SI XMLTrouve("CMONDOC") ALORS
xMLFils("CMONDOC")
SI PAS XMLEnDehors("CMONDOC") ALORS
XMLFils("CMONDOC")

SI PAS XMLEnDehors("CMONDOC") ALORS
XMLPremier("CMONDOC")
TANTQUE PAS XMLEnDehors("CMONDOC")
SI XMLNomElément("CMONDOC") = "data" ALORS
XMLFils("CMONDOC")
TANTQUE PAS XMLEnDehors("CMONDOC")
nligne= 2
TableAjouteLigne(TABLEDN,XMLDonnée("CMONDOC"))
XMLSuivant("CMONDOC")
FIN
XMLParent("CMONDOC")
FIN
XMLSuivant("CMONDOC")
FIN
FIN
FIN
FIN

e
Posté le 26 mai 2016 - 10:39
Bonjour Fabrice,

J'ai déjà essayé cette importation de l'XML.

Il y a tout de même un problème :
- tous les abonnés sont bien importés.
- le détail concernant chaque abonné (dans une balise fils) n'est pas importé correctement. Il n'y a que les données du premier abonné qui sont importées.

Je ne peux donc pas récupérer les données de chaque abonné.

Qu'en penses-tu ?

Merci pour ton aide.

F. BUCAMP
Posté le 26 mai 2016 - 15:51
Bonjour,

On manipule les fichiers XML
- soit par le biais d'un document texte et de la fonction XMLDocument() (et de la cohorte de fonctions qui lui sont associées). Voir la réponse de Baptiste CLOART en début de discussion.
Je suppose que dans cette configuration que je n'utilise pas, sauf fonction spécifique, une méthode serait d'isoler le chaîne des attributs et puis de procéder par ExtraitChaîne avec le caractère espace comme séparateur.
- soit avec la variable XMLDocument et les variables qui lui sont associées (essentiellement XMLNoeud et XMLAttribut), auquel cas tout se 'résume' à des parcours de tableaux.
Par exemple, un XMLNoeud a une propriété ..Attribut qui est en fait un tableau des attributs de ce nœud. Le principe de tout ceci est illustré par un exemple dans la doc ( http://doc.pcsoft.fr/fr-FR/?3081042&name=Exemple_utilisation_des_types_XML ).
L'utilisation des variables spécifiques est maintenant (ce n'était pas le cas dans ma version 18) conseillé comme la méthode de choix.

Bonne lecture

Hemgé
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 26 mai 2016 - 17:28
hello,
si le fichier xml le permet , cela peut être beaucoup plus simple en utilisant une description xml
voir ici : http://doc.pcsoft.fr/fr-FR/?3081018#principe_utilisation_ELTPARAGRAPHE000149
voici ce que cela donne par exemple :





--
Ami calmant, J.P
Posté le 26 mai 2016 - 18:12
Bonjour Emgé,

Merci pour ton conseil.

Je rencontre quelques problèmes :
- la lecture qui commence à la racine, ne commence la lecture des Abonnés qu'à partir du n°2.
- je ne souhaite pas tout lire mais seulement quelques données pour chaque Abonné.

Est-ce possible de modifier le code pour pouvoir choisir les données à extraire et les ajouter un fichier FIC ?

Merci pour tout aide.

F. BUCAMP
Posté le 26 mai 2016 - 18:12
Bonjour Emgé,

Merci pour ton conseil.

Je rencontre quelques problèmes :
- la lecture qui commence à la racine, ne commence la lecture des Abonnés qu'à partir du n°2.
- je ne souhaite pas tout lire mais seulement quelques données pour chaque Abonné.

Est-ce possible de modifier le code pour pouvoir choisir les données à extraire et les ajouter un fichier FIC ?

Merci pour tout aide.

F. BUCAMP
Posté le 26 mai 2016 - 18:16
Bonsoir Emgé,

Merci pour ton conseil.

Je rencontre tout de même des problèmes.
- la trace est complète sauf qu'après la racine, c'est l'Abonné n° 2 qui commence la suite.
- je n'ai pas besoin de toutes les balises et attributs mais quelques données pour chaque Abonné et les ajouter dans un fichier FIC.

Est-ce possible ?

Merci pour ta réponse.

F. BUCAMP
Posté le 26 mai 2016 - 18:23
Bonsoir Jurassic,

Je possède le flux XSD que j'ai importé dans Windev.

J'ai importé cette description mais :
- les Abonnés sont bien importés mais les données spécifiques à chaque Abonné ne le sont pas. Seules les données du premier Abonné sont importés.

Est-ce normal ?

Merci pour ton aide.

F. BUCAMP
Membre enregistré
6 messages
Posté le 26 mai 2016 - 19:02
Bonsoir Jurassic,

Comment déclares-tu la variable "elem".
Si je la déclare en xmlNoeud, la ligne "elem:ID" provoque une erreur : "il n'existe pas de parcours de type xmlNoeud sur un élément de xmlAttribut.

Si la délcare en xmlAttribut, "elem:ID", les deux points sont des opérateurs interdits.

Que faire ?

Merci pour ton aide.

F. BUCAMP

--
Cordialement.

F. BUCAMP
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 26 mai 2016 - 23:02
elem n'a pas besoin d'être déclarée car c'est une variable de type classe dynamique :
POUR TOUT [ELEMENT] <Variable> [, <Clé> [, <Compteur>]] DE <Tableau>
<Variable> :
Variable exactement du même type que les éléments du tableau. Pour des tableaux de classe, la variable doit être de type Classe dynamique. Il n'est pas nécessaire de déclarer cette variable.


--
Ami calmant, J.P
Posté le 26 mai 2016 - 23:19
Bonsoir

Ce qu'il y a de simple avec la variable XMLDocument, c'est qu'on travaille avec des propriétés dont certaines sont des tableaux ... qu'il suffit de parcourir comme n'importe quel tableau en testant ou en filtrant etc.
L'exemple que je vous avais indiqué me semble limpide, du moins après une bonne lecture de la doc.

Apparemment, vous vous agitez beaucoup, mais sans lire la doc calmement et complètement.

Par exemple, concernant le nœud, qui vous pose tellement de problème, il me semble que toutes les précisions que vous demandez sont exposées dans la doc sur cette variable ( http://doc.pcsoft.fr/fr-FR/?1000018786&name=TYPE_xmlNoeud )

Evidemment qu'il n'existe pas de parcours de type nœud sur un xmlAttribut.
Tout d'abord, cela découle des règles de formation des documents XML (que vous devriez sans doute également appréhender).
Mais, même sans se préoccuper de ces règles, il apparaît bien dans la doc sur xmlNoeud que cette variable possède parmi ses propriétés une propriété ..Attribut (la première par ordre alphabétique) qui est un "Tableau de xmlAttribut", soit un "Tableau des attributs XML associés au nœud".
De même, il existe une propriété ..NoeudFils qui est un "Tableau de xmlNoeud", soit un "Tableau des nœuds fils."
Etc.

Donc, vous devez lire et assimiler, puis tester. Et relire.

Quant au fait que ceci ou cela ne fonctionne pas, il faut relire votre code (que nous ne connaissons pas) et éventuellement voir les données (qui sont, elles, confidentielles). Difficile de se prononcer dans ces conditions.
Membre enregistré
6 messages
Posté le 29 mai 2016 - 09:43
Bonjour Jurassic,

J'ai deux difficultés :
l'Abonné 1 n'est pas intégré. "POUR TOUT" commence au deuxième rengistrement.
Comment intégrer deux renseignements ayant les mêmes noeuds ?

Merci pour ton aide.

F. BUCAMP

--
Cordialement.

F. BUCAMP
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 29 mai 2016 - 10:16
hello,
peux-tu mettre dans le forum le début de ton fichier xml (jusqu'au deuxième abonné par exemple) en remplaçant les données confidentielles ( nom adresse par exemple) par des données "bidon".

--
Ami calmant, J.P
Membre enregistré
6 messages
Posté le 29 mai 2016 - 15:00
Bonjour Ami Calmant,

Pourrais-tu me transmettre ton adresse mail car je n'arrive pas à te transmettre une image JPG du flux XML que j'obtiens.

Merci.

F. BUCAMP
Membre enregistré
6 messages
Posté le 29 mai 2016 - 15:04
Hemgé a écrit :
Bonsoir

Ce qu'il y a de simple avec la variable XMLDocument, c'est qu'on travaille avec des propriétés dont certaines sont des tableaux ... qu'il suffit de parcourir comme n'importe quel tableau en testant ou en filtrant etc.
L'exemple que je vous avais indiqué me semble limpide, du moins après une bonne lecture de la doc.

Apparemment, vous vous agitez beaucoup, mais sans lire la doc calmement et complètement.

Par exemple, concernant le nœud, qui vous pose tellement de problème, il me semble que toutes les précisions que vous demandez sont exposées dans la doc sur cette variable ( http://doc.pcsoft.fr/fr-FR/?1000018786&name=TYPE_xmlNoeud )

Evidemment qu'il n'existe pas de parcours de type nœud sur un xmlAttribut.
Tout d'abord, cela découle des règles de formation des documents XML (que vous devriez sans doute également appréhender).
Mais, même sans se préoccuper de ces règles, il apparaît bien dans la doc sur xmlNoeud que cette variable possède parmi ses propriétés une propriété ..Attribut (la première par ordre alphabétique) qui est un "Tableau de xmlAttribut", soit un "Tableau des attributs XML associés au nœud".
De même, il existe une propriété ..NoeudFils qui est un "Tableau de xmlNoeud", soit un "Tableau des nœuds fils."
Etc.

Donc, vous devez lire et assimiler, puis tester. Et relire.

Quant au fait que ceci ou cela ne fonctionne pas, il faut relire votre code (que nous ne connaissons pas) et éventuellement voir les données (qui sont, elles, confidentielles). Difficile de se prononcer dans ces conditions.




Je peux envoyer un flux xml de ce genre de fichier, légèrement modifié tant au niveau des données que des noms des balise, noeuds et attributs.
Comment puis-je vous envoyer ce flux ?
Merci.

F. BUCAMP
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 30 mai 2016 - 03:13
hello,
pourquoi ne fais-tu pas un copier coller du début de ton fichier XML en modifiant les données confidentielles dans un message ici dans le forum en utilisant la balise CODE (1ère icone insérer du code et choisir XML et mettre le code XML à l'intérieur). Une image c'est pas terrible car il faut retaper le texte.

--
Ami calmant, J.P
Membre enregistré
6 messages
Posté le 30 mai 2016 - 08:32
Bonjour,

1. Mainteant, par quel hasard, le premier abonné apparaît ? Mystère. Cela fonctionne donc.
2. Pour récupérer deux fois les renseignements d'une même balise, noeud ou attribut, il siffisait de mettre [1] puis [2].
Le problème peut se poser si l'abonné n'a qu'un seul relevé et non deux au niveau de "Histoire" (Ind1 et Ind2)

<?xml version="1.0" encoding="UTF-8"?>

-<EssaiJeu XMLVersion="v1.00" Name="Essai" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


-<JEU Code="1" Id="2" Nom="RELEVE">


-<JEUSettings>

<JEUJeuSet EDeb5="5" EDeb4="15" EDeb3="20" EDeb2="25" EDeb1="30" MaxNum4="200" MaxNum3="150" MaxNum2="100" MaxNum1="50" Num1="0"/>

</JEUSettings>


-<JEUData>


-<Abonnes>


-<Personne Code="4001" Nom="AAAA" IdAbon="4001" Modifie="true" Cree="true" Ville="JOBARD" CP="20000 " Addresse="1 RUE PRINCIPALE" Prenom="BBBB">


-<RefComp>


-<InfoComp Code="4001" Modifie="true" Cree="true" AutoLect="false" NumFile="1" Message="" Lecture="" NumComp="15BA079436 " Type2="0" Energie="2" NbDec="3" Dents="8" Type1="0">


-<InfComp>

<InfCompSp Nom="DIAMETRE" Diam="15"/>

</InfComp>


-<Histoires>

<Histoire Type1="0" Ind1="427" Date1="2014-02-27T00:00:00"/>

<Histoire Type2="1" Ind2="556" Date2="2015-05-14T00:00:00"/>

</Histoires>

</InfoComp>

</RefComp>

</Personne>


-<Personne Code="4002" Nom="CCCC" IdAbon="4002" Modifie="true" Cree="true" Ville="JOBARD" CP="20000 " Addresse="33 RUE PRINCIPALE" Prenom="DDDD">


-<RefComp>


-<InfoComp Code="4002" Modifie="true" Cree="true" AutoLect="false" NumFile="2" Message="" Lecture="" NumComp="15BA079465 " Type2="0" Energie="2" NbDec="3" Dents="8" Type1="0">


-<InfComp>

<InfCompSp Nom="DIAMETRE" Diam="15"/>

</InfComp>


-<Histoires>

<Histoire Type1="0" Ind1="41" Date1="2014-02-28T00:00:00"/>

<Histoire Type2="1" Ind2="108" Date2="2015-05-14T00:00:00"/>

</Histoires>

</InfoComp>

</RefComp>

</Personne>


--
Cordialement.

F. BUCAMP
Posté le 30 mai 2016 - 10:02
Hemgé a écrit :
Bonsoir

Ce qu'il y a de simple avec la variable XMLDocument, c'est qu'on travaille avec des propriétés dont certaines sont des tableaux ... qu'il suffit de parcourir comme n'importe quel tableau en testant ou en filtrant etc.
L'exemple que je vous avais indiqué me semble limpide, du moins après une bonne lecture de la doc.


Bon,

Maintenant, nous avons un aperçu de l'XML.
Nous n'avons toujours pas votre code.

A ce stade, réduits à cette espèce d'unijambisme, qu'attendez-vous de nous et qu'espérez-vous que nous puissions faire, à part gloser et supputer ?
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 30 mai 2016 - 17:48
hello,
il est bizarre ton xml avec les - devant certaines balises .
En le remodelant comme cela:
<?xml version="1.0" encoding="UTF-8"?>
<EssaiJeu XMLVersion="v1.00" Name="Essai" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<JEU Code="1" Id="2" Nom="RELEVE">
<JEUSettings>
<JEUJeuSet EDeb5="5" EDeb4="15" EDeb3="20" EDeb2="25" EDeb1="30" MaxNum4="200" MaxNum3="150" MaxNum2="100" MaxNum1="50" Num1="0"/>
</JEUSettings>
<JEUData>
<Abonnes>
<Personne Code="4001" Nom="AAAA" IdAbon="4001" Modifie="true" Cree="true" Ville="JOBARD" CP="20000 " Addresse="1 RUE PRINCIPALE" Prenom="BBBB">
<RefComp>
<InfoComp Code="4001" Modifie="true" Cree="true" AutoLect="false" NumFile="1" Message="" Lecture="" NumComp="15BA079436 " Type2="0" Energie="2" NbDec="3" Dents="8" Type1="0">
<InfComp>
<InfCompSp Nom="DIAMETRE" Diam="15"/>
</InfComp>
<Histoires>
<Histoire Type1="0" Ind1="427" Date1="2014-02-27T00:00:00"/>
<Histoire Type2="1" Ind2="556" Date2="2015-05-14T00:00:00"/>
</Histoires>
</InfoComp>
</RefComp>
</Personne>
</Abonnes>
</JEUData>
</JEU>
</EssaiJeu>

j'arrive à l'importer en description XML dans windev