Page 1 sur 1

XML - ordre des attributs

Publié : dim. 25/sept./2022 21:54
par Bmld76
Bonsoir,

Je travaille sur des fichiers XML. Lors de la lecture d'un fichier XML est-il possible d'avoir des informations sur l'ensemble des attributs d'un noeud. Genre nombre, ordre.

La raison est que pour enregistrer les attributs d'un noeud , je détecte le dernier attribut pour déclencher l'enregistrement dans une base. Ca fonctionne mais la fédération sportive qui produit le fichier vient de changer l'ordre de attributs et donc ca ne fonctionne plus.

Je cherche a lire un XML en me démarquent de l'ordre des noeud et des attributs. Je pense que c'est comme cela que l'on doit procédé. (je découvre la gestion des Xml)

Je pourrais faire un programme test mais pas ce soir.

Merci


Bien cordialement

Re: XML - ordre des attributs

Publié : lun. 26/sept./2022 8:45
par Bmld76
Bonjour,

J'ai fais un programme test pour traiter les données XML ce qui m'a conduit vers une solution.

Lors de la lecture des attributs il faut mettre l"enregistrement de ces attributs, chargé dans une variable structurée temporaire, à la fin de la scrutation et nom de détecté le dernier attribut.

J'insère tout de même mon programme de test si ca peu aider

Cordialement

Code : Tout sélectionner

 
 #Window     = 0
#TreeGadget = 0
#XML        = 0
  

Structure TireurStruc
  nom.s
  prenom.s
  sexe.s
  club.s
EndStructure

Structure ArbitreStruc
  nom.s
  prenom.s
  sexs.s
  club.s
EndStructure

Dim TabTireur.TireurStruc(10)
Dim TabArbitre.TireurStruc(10)

Procedure FillTree(*CurrentNode, CurrentSublevel)
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal
    
    Text$ = GetXMLNodeName(*CurrentNode) + ": "
    
    If ExamineXMLAttributes(*CurrentNode)
      While NextXMLAttribute(*CurrentNode)
        Text$ + " Attribute:" + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
        Debug " 2"+Text$  
      Wend
    EndIf  
    
    Text$+ " " + GetXMLNodeText(*CurrentNode)
    Debug " 1"+ Text$  
    Debug "enregistre ici "
    
    AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel)
    
    *ChildNode = ChildXMLNode(*CurrentNode)
    While *ChildNode <> 0
      FillTree(*ChildNode, CurrentSublevel + 1)
      *ChildNode = NextXMLNode(*ChildNode)
    Wend
  EndIf
EndProcedure 


XML$ =  "<BaseCompetitionIndividuelle>"+
        "<Tireurs>" +
        "<Tireur Sexe='M' ID='11890' Points='245,26' Classement='1445' Club='La Rapière Hérouville' Licence='011889' Lateralite='D' Nation='FRA' DateNaissance='08.07.1976' Prenom='Hermann' Nom='CHALUME'/>" +
        "<Tireur Sexe='M' ID='14665' Points='' Classement='' Club='Rouen' Licence='014664' Lateralite='D' Nation='FRA' DateNaissance='22.05.1988' Prenom='Florian' Nom='CRASPIN'/>" +      
        "</Tireurs>" +
        "<Arbitres>" +
        "<Arbitre Categorie='' Sexe='M' ID='45479' Club='DIEPPE' Licence='045478' Nation='FRA' DateNaissance='12.05.1995' Prenom='Nicolas' Nom='PELLETTE' Ligue='NORMANDIE'/>" +
        "<Arbitre Categorie='' Sexe='M' ID='23128' Club='Nancy' Licence='023127' Nation='FRA' DateNaissance='29.10.1996' Prenom='Nathan' Nom='FROGY' Ligue='NORMANDIE'/>" +
        "</Arbitres>" +
        "</BaseCompetitionIndividuelle>"

  If ParseXML(#Xml, XML$) ; And XMLStatus(#Xml) = #PB_XML_Success

    If XMLStatus(#XML) <> #PB_XML_Success
      Message$ = "Error in the XML file:" + Chr(13)
      Message$ + "Message: " + XMLError(#XML) + Chr(13)
      Message$ + "Line: " + Str(XMLErrorLine(#XML)) + "   Character: " + Str(XMLErrorPosition(#XML))
      MessageRequester("Error", Message$)
    EndIf

    If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
      TreeGadget(#TreeGadget, 10, 10, 480, 480)
      
      ; Get the main XML node, and call the FillTree() procedure with it
      ;
      *MainNode = MainXMLNode(#XML)
      If *MainNode
        FillTree(*MainNode, 0)
      EndIf
      For i = 0 To CountGadgetItems(#TreeGadget) - 1
        SetGadgetItemState(#TreeGadget, i, #PB_Tree_Expanded)
      Next i
      Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow
    EndIf
        
  Else
    MessageRequester("Error", "The file cannot be opened.")
  EndIf