Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 13-10-2008 14:51:08

cantin_jl  
Membre completement Geek
Lieu: 49120 Chemillé
Date d'inscription: 10-01-2007
Messages: 132
Pépites: 552
Banque: 0
Site web

[RESOLU] Import donnée XML dans une DataWinDow

Bonjour,

Je travaille en Pb10.5.
J'aimerais savoir s'il est possible de récupérer les données d'un fichier XML avec ses balises dans une Datawindow sans avoir au préalable créé un long et fastidieux template.  En résumé, comment récupérer les données d'un fichier XML et son organisation sans avoir, au préalable, défini sa structure.

Merci d'avance

Dernière modification par cantin_jl (16-10-2008 14:57:51)


Les inventions qui ne sont pas connues ont toujours plus de censeurs que d'approbateurs

Hors ligne

 

#2 13-10-2008 15:54:30

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: [RESOLU] Import donnée XML dans une DataWinDow

Sans template, l'import XML a lieu en postulant que le XML respecte la structure des colonnes de la DW. Le parser XML va extraire les données qu'il lit séquentiellement dans le XML et insérer les données dans la 1ère colonne libre, ou s'il n'y en a plus, la 1ère colonne d'une nouvelle ligne.
Tout marche bien si ton XML n'est pas hierarchique, et tant que les valeurs de ses entités peuvent être castées dans le type des colonnes utilisées...
Dans un cas comme celui-ci, le mieux est de définir une DW external, constituée de string de longueur 0 (ce qui signifie pas de longueur max).

Evidemment, il y a des tonnes de cas dans lesquels cela ne marchera pas... Désolé, il n'y a pas de solution toute faite. C'est comme dans les autres langages: si tu connais la structure, tu l'encode, sinon tu passe par le DOM... Et en PB tu as PBDOM qui te permet de parser un XML de format inconnu.
Tu peux ainsi générer un template grace a PBDOM, pour automatiser ton import DW (qui est beacoup plus performant que le DOM).

Satisfait?

Hors ligne

 

#3 14-10-2008 07:48:41

cantin_jl  
Membre completement Geek
Lieu: 49120 Chemillé
Date d'inscription: 10-01-2007
Messages: 132
Pépites: 552
Banque: 0
Site web

Re: [RESOLU] Import donnée XML dans une DataWinDow

Merci pour cette réponse.
Puis-je me permettre de demander un exemple d'utilisation de la "bête" (lecture d'un fichier XML)?

Merci d'avance.


Les inventions qui ne sont pas connues ont toujours plus de censeurs que d'approbateurs

Hors ligne

 

#4 14-10-2008 10:29:56

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: [RESOLU] Import donnée XML dans une DataWinDow

Tu peux te permettre, mais je ne pourrai rien pour toi aujourd'hui, je suis en clientèle...

De toute facon, il n'y a rien de spécial à faire: tu prend un XML super simple, et une dw external avec des colonnes de type string suffisamment grande, puis un dw_control.import(xml!,...)
Je sais plus vraiment, j'ai pas PB ici

Bonne chance:fra:

Hors ligne

 

#5 14-10-2008 13:13:49

cantin_jl  
Membre completement Geek
Lieu: 49120 Chemillé
Date d'inscription: 10-01-2007
Messages: 132
Pépites: 552
Banque: 0
Site web

Re: [RESOLU] Import donnée XML dans une DataWinDow

Bon, après quelques recherches, voila à quoi ressemble mon code :

Code test présent dans un bouton

Code: pb

dw_datas.ImportFile(XML!,"C:\TEMP\snecma_xml\ORDER_004244_875137")


long ll_ret
ll_ret = XMLParseFile("C:\TEMP\snecma_xml\ORDER_004244_875137.xml", ValNever!)

PBDOM_Builder     lpbdom_Builder
PBDOM_Document   lpbdom_Doc
PBDOM_Object     lpbdom_Obj[]
PBDOM_Attribute   lpbdom_Attr[]
PBDOM_Element     lpbdom_Root
integer         li_Counter, li_Max
string         ls_Text


// Create PBDOM Builder
lpbdom_Builder = CREATE PBDOM_BUILDER
TRY
  // Import File and generate XML Document
  lpbdom_Doc = lpbdom_Builder.BuildFromFile("C:\TEMP\snecma_xml\ORDER_004244_875137.xml" )

CATCH (PBDOM_Exception lpbdom_Except)
  // Error Handling goes here,
  MessageBox( "PBDOM_Exception", lpbdom_Except.GetExceptionCode())
  RETURN
END TRY

// Get 1st Level data
lpbdom_Doc.GetContent( lpbdom_Obj )

wf_lecture_xml(lpbdom_Obj, 0)



Détail fonction wf_lecture_xml

Code: pb

PBDOM_Object lpbdom_Children[]
PBDOM_Attribute lpbdom_Attr[]
PBDOM_Element lpbdom_Element
long ll_Handle
integer li_Counter, li_Max, li_AttrCounter, li_AttrMax
string ls_Disp

li_Max = UpperBound(apbdom_Obj)
// Loop through all elements in the array

FOR li_Counter = 1 TO li_Max
  ls_Disp = ""
  // Get tag information depeding on type of entry
  CHOOSE CASE apbdom_Obj[li_Counter].GetObjectClassString()
    CASE "pbdom_processinginstruction"
      ls_Disp = ": " + apbdom_Obj[li_Counter].DYNAMIC GetData()
    CASE "pbdom_text"
      ls_Disp = ": " + apbdom_Obj[li_Counter].DYNAMIC GetText()
    CASE "pbdom_element"
      // An element might have attributes
      lpbdom_Element = apbdom_Obj[li_Counter]
      IF lpbdom_Element.HasAttributes() THEN
        lpbdom_Element. GetAttributes(lpbdom_Attr)
        li_AttrMax = UpperBound(lpbdom_Attr)
        // Loop through all attributes
        FOR li_AttrCounter = 1 TO li_AttrMax
          ls_Disp = ls_Disp + lpbdom_Attr[li_AttrCounter].GetName()+"=" + lpbdom_Attr[li_AttrCounter].GetText()+ " "
        NEXT
        ls_Disp = ": " + ls_Disp
      END IF
    CASE ELSE
      ls_Disp = ": " + apbdom_Obj[li_Counter].GetText() 
  END CHOOSE
  // Display name + additional information
  ls_Disp = apbdom_Obj[li_Counter].GetName()+ls_Disp
  ll_Handle=tv_1.InsertItemLast(al_Parent,ls_Disp,0)
  // if object has children call the same function
  IF apbdom_Obj[li_Counter].HasChildren() THEN
    apbdom_Obj[li_Counter].GetContent(lpbdom_Children)
    wf_lecture_xml(lpbdom_Children,ll_Handle)
    tv_1.ExpandItem(ll_Handle)
  END IF
NEXT

RETURN 



Cela me permet de mettre le contenu du fichier XML dans un TreeView.
J'espère que cet exemple sera utile à quelqu'un d'autre.
Finalement PBDOM, c'est bien mais pas assez documenté.

Merci à ceux qui m'ont aidé.


Les inventions qui ne sont pas connues ont toujours plus de censeurs que d'approbateurs

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22