PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Lecture d'une reponse en XML
Lecture d'une reponse en XML
Iniciado por go24, 25,oct. 2019 16:19 - 5 respuestas
Publicado el 25,octubre 2019 - 16:19
Bonjour,

J 'utilise un web service (compta) qui me renvoi une reponse sous la forme d'un XML
Voici un ex de la reponse

<BrowseDetailsResponse version="14.0">
<Update>
<Response status="success">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400093044</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
<Response status="success">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400099707</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
</Update>
</BrowseDetailsResponse>



j 'utilise XMLExtraitChaîne qui est bien pratique et me permet de choisir la ligne que je veux traiter :

dans ce code la pas de probleme les info sont toutes OK
sLook4 = XMLExtraitChaîne(sResponse,"Code",nLigne,XMLExact)
sLook4 = XMLExtraitChaîne(sResponse,"Number",nLigne,XMLExact)
sLook4 = XMLExtraitChaîne(sResponse,"CmpCode",nLigne,XMLExact)
sLook4 = XMLExtraitChaîne(sResponse,"LineNumber",nLigne,XMLExact)

//////////////////////////////////////////////////////////////
La ou je bute c'est sur <Response status="success">

////// Rien de ceci ne marche !!!!!!!
sLook4 = XMLExtraitChaîne(sResponse,"Response[1]_status",1,XMLIgnoreLaCasse)
sLook4 = XMLExtraitChaîne(sResponse,"Response[1]/status",1,XMLIgnoreLaCasse)
sLook4 = XMLExtraitChaîne(sResponse,"Response[1]@status",1,XMLIgnoreLaCasse)
sLook4 = XMLExtraitChaîne(sResponse,"Response[1]/@status",1,XMLIgnoreLaCasse)
sLook4 = XMLExtraitChaîne(sResponse,"Response[1]@status",1,XMLIgnoreLaCasse)
sLook4 = XMLExtraitChaîne(sResponse,"status",1,XMLIgnoreLaCasse)
sLook4 = XMLExtraitChaîne(sResponse,"Response status",1,XMLIgnoreLaCasse)


si qq a deja rencontre ce type de probleme son aide serait bienvenue

Cdl
Miembro registrado
948 mensajes
Publicado el 25,octubre 2019 - 18:23
Bonjour
Effectivement je ne suis pas arrivé à récupérer avec cette fonction la valeur de la balise status. Peut-être que ce bout de code vous aidera à trouver une solution
XMLDocument("test", XMLData)
IF ErreurDétectée THEN
Erreur("les données ne sont pas au format XML")
RETOUR
END

Trace("A-"+XMLPosition("test")) // A-/BrowseDetailsResponse

XMLFils("test")
Trace("B-"+XMLPosition("test")) // B-/BrowseDetailsResponse/@version
Trace("C-"+XMLDonnée("test")) // C-14.0

XMLSuivant("test")

XMLFils("test")
Trace("D-"+XMLPosition("test")) // D-/BrowseDetailsResponse/Update/Response[1]
Trace("E-"+XMLDonnée("test")) // E- \n

XMLFils("test")
Trace("F-"+XMLPosition("test")) // F-/BrowseDetailsResponse/Update/Response[1]/@status
Trace("G-"+XMLDonnée("test")) // G-success


--
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai.
Quand un utilisateur vous a aidé, n'oubliez pas de le remercier...
Publicado el 25,octubre 2019 - 19:10
En tout cas merci pour la reponse je teste ca des Lundi
Bon week end
Publicado el 29,octubre 2019 - 09:28
En fait voici la solution que j'ai trouvé

sResponse =[
<BrowseDetailsResponse version="14.0">
<Update>
<Response status="success">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400093044</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
<Response status="failed">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400099707</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
</Update>
</BrowseDetailsResponse>
]

sLook4 est une chaîne
WL.XMLDocument("XLDoc" , sResponse)
IF ErreurDétectée THEN
Erreur("les données ne sont pas au format XML")
RETOUR
END

Pour nligne = 1 to Maxligne


sLook4 = XMLLit("XLDOC","/BrowseDetailsResponse/Update/Response["+ nLigne +"]/@status")
// "/BrowseDetailsResponse/Update/Response[x]/@status"

SI sLook4 = "success" ALORS
sLook4 = XMLExtraitChaîne(sResponse,"Code",nLigne,XMLExact)
sLook4 = XMLExtraitChaîne(sResponse,"Number",2,XMLExact)
sLook4 = XMLExtraitChaîne(sResponse,"Code",2,XMLExact)
sLook4 = XMLExtraitChaîne(sResponse,"Update",2,XMLExact)
SINON
...
FIN

Merci pour l'aide
Miembro registrado
4 mensajes
Publicado el 29,octubre 2019 - 11:30
Bonjour,

Sous Windev, chaque balise du fichier XML (xmlDocument) correspond à un nœud (xmlNoeud).
Chaque nœud a un nom et une valeur (..Texte et ..Nom).
Par exemple : <Code>BETAC40</Code>

Dans <Response status="success">, success est un attribut de la balise <Response status> (xmlAttribut).
Pour chaque nœud, il faut tester si une occurrence d'attribut existe : xml_Noeud_1..Attribut..Occurrence.
Si elle existe, on la récupère : xml_Attribut = xml_Noeud_1..Attribut[1].

J'espère que ce bout de code pourra vous aider :

s_XML est une chaîne
xml_Doc est un xmlDocument
xml_Noeud_Racine est un xmlNoeud
xml_Attribut est un xmlAttribut
xml_Noeud_1 est un xmlNoeud

s_XML = [
<BrowseDetailsResponse version="14.0">
<Update>
<Response status="success">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400093044</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>

<Response status="success">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400099707</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
</Update>
</BrowseDetailsResponse>
]

xml_Doc = XMLOuvre(s_XML, depuisChaîne)

xml_Noeud_Racine = {"xml_Doc.BrowseDetailsResponse.Update"}

Trace("Occurrence Response status : " + TableauOccurrence(xml_Noeud_Racine))

POUR TOUT xml_Noeud_1 de xml_Noeud_Racine
xml_Attribut = xml_Noeud_1..Attribut[1]
Trace("Balise : " + xml_Noeud_1..Nom + " // Attribut : " + xml_Attribut..Valeur)
FIN
Miembro registrado
953 mensajes
Publicado el 29,octubre 2019 - 12:17
bonjour Go24,

vous pouvez aussi importer un fichier XML dans Windev pour avoir la saisie assistée de Windev.

vous importez ce fichier XML dans Windev , dans le treeview du projet , partie 'Descriptions externes' , clic droit 'Importer un XML ou un JSON...'

Exemple de fichier XML à importer :
<BrowseDetailsResponse version="14.0">
<Update>
<Response status="success">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400093044</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
<Response status="failed">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400099707</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
</Update>
</BrowseDetailsResponse>


Puis ensuite, vous pourrez déclarer un XMLDocument basé sur ce fichier, avec l'option <description="">

Exemple, si vous avez appelé votre fichier XML 'WS_compta_response' :
_my_xml est un xmlDocument<Description="WS_compta_response">

sResponse est une chaîne=[
<BrowseDetailsResponse version="14.0">
<Update>
<Response status="success">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400093044</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
<Response status="failed">
<TxnKey>
<Key>
<CmpCode>COMPANY</CmpCode>
<Code>BETAC40</Code>
<Number>1400099707</Number>
<LineNumber>2</LineNumber>
</Key>
<TimeStamp>1</TimeStamp>
</TxnKey>
</Response>
</Update>
</BrowseDetailsResponse>
]

_my_xml=XMLOuvre(sResponse,depuisChaîne)

POUR _id_response=1 _À_ _my_xml.BrowseDetailsResponse.Update.Response..Occurrence
Trace("Response id : "+_id_response+" , status = "+_my_xml.BrowseDetailsResponse.Update.Response[_id_response]:status)
FIN