Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
J'ai un fichier XML à générer au départ d'une DW contenant pas mal d'autres DW contenant chacunes des computed field.
J'ai été voir la documentation se trouvant dans la discussion "[DOC] pb9 et xml"
Il y a une méthode pour générer du XML par le code en Powerbuilder.
Je pense que c'est ce style de trt que je dois effectuer, cad balayer mes DW remplies et écrire ensuite dans un datastore contenant mon template, puis faire un saveas pour créer mon fichier XML.
Je viens vers vous afin de voir s'il n'existe pas une autre méthode plus performante.
Merci
Dernière modification par Sylvie de hannut (28-12-2012 14:30:56)
Hors ligne
Ben oui tu as la bonne solution déjà je pense
Dernière modification par rincevent (13-11-2012 15:12:44)
Hors ligne
Après mûre réflection, et surtout après en avoir parlé à un collègue, je vais travailler avec PBDOM.
Mais, j'ai épluché de la doc hier et je ne comprend pas, pour chaque balise différente, je dois créer une variable de type pbdom_element ???
PS : je n'ai jamais travaillé avec PBDOM ...
Hors ligne
Recherche les discussions de wazou1812 ici traitant d'xml, on a plusieurs fois évoqué pbdom et tu devrais pouvoir trouver des exemples.
En regardant les archives, je pensais notamment à
- XML : supprimer des balises vides avec pbdom
- Question sur l'utilisation de PBDOM pour la création d'un fichier XML
Dernière modification par seki (14-11-2012 09:09:21)
Hors ligne
J'ai vu comment retirer une balise vide, comment retiré un summary, comment aller chercher la valeur d'une balise, mais je vois pas clairement comment créer du XML avec PBDOM.
Si quelqu'un pouvait m'aider à commencer mon xml, entête + premières balises, je pourrais continuer facilement.
Voici le début du xml à faire via le xsd reçu :
<?xml version="1.0" encoding="UTF-8"?> <!-- edited with XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) by SHOCK (SHOCK) --> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> -<xs:annotation> <xs:documentation>Schema for DataStore produced by formulaire_Rapport_Trimestriel</xs:documentation> </xs:annotation> -<xs:element name="dataStore"> -<xs:complexType> -<xs:all> -<xs:element name="anneeDuRapport"> -<xs:simpleType> -<xs:restriction base="xs:integer"> <xs:enumeration value="2012"/> <xs:enumeration value="2013"/> <xs:enumeration value="2014"/> <xs:enumeration value="2015"/> <xs:enumeration value="2016"/> </xs:restriction> </xs:simpleType> </xs:element> -<xs:element name="trimestreDuRapport"> -<xs:simpleType> -<xs:restriction base="xs:string"> <xs:enumeration value="trimestre1"/> <xs:enumeration value="trimestre2"/> <xs:enumeration value="trimestre3"/> <xs:enumeration value="trimestre4"/> </xs:restriction> </xs:simpleType> </xs:element> -<xs:element name="demandeur"> -<xs:complexType> -<xs:all> -<xs:element name="identification"> -<xs:complexType> -<xs:sequence> -<xs:element name="numBCE"> -<xs:simpleType> -<xs:restriction base="xs:string"> <xs:pattern value="[0-1][0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9]"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="denomination" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> ..........
Pour chaque balise je dois créer un PBDOM_element, faire un create, un setname et un addcontent ??????
Merci beaucoup
Dernière modification par Sylvie de hannut (14-11-2012 09:18:00)
Hors ligne
Sylvie de hannut a écrit:
Si quelqu'un pouvait m'aider à commencer mon xml, entête + premières balises, je pourrais continuer facilement.
Regarde Question sur l'utilisation de PBDOM pour la création d'un fichier XML il y a un exemple.
Hors ligne
voici le début de mon code est-ce correct ????
Question la commande addcontent ajoute une valeur à une balise ou permet d'jouter un noeud fils, est correct ???
PBDOM_Document xml_doc PBDOM_ProcessingInstruction xml_process PBDOM_Element xml_root PBDOM_Element xml_ds PBDOM_Element xml_rapp_an PBDOM_Element xml_rapp_trim PBDOM_Element xml_demandeur PBDOM_Element xml_dem_ident PBDOM_Element xml_dem_bce PBDOM_Element xml_dem_denom //constant string root_name = "datastore" try xml_doc = create PBDOM_Document xml_doc.newdocument("","","cXML","","http://www.w3.org/2001/XMLSchema") xml_process = create PBDOM_ProcessingInstruction xml_process.setname("xml") xml_process.setvalue("version", "1.0") xml_process.setvalue("encoding","utf-8") xml_doc.addcontent(xml_process) destroy xml_process xml_root = xml_doc.getrootelement() // continue the document creation xml_ds = create PBDOM_Element xml_rapp_an = create PBDOM_Element xml_rapp_trim = create PBDOM_Element xml_demandeur = create PBDOM_Element xml_dem_ident = create PBDOM_Element xml_dem_bce = create PBDOM_Element xml_dem_denom = create PBDOM_Element xml_ds.SetName("dateStore") xml_rapp_an.SetName("anneeDuRapport") xml_rapp_trim.SetName("trimestreDuRapport") xml_demandeur.SetName("demandeur") xml_dem_ident.SetName("Identification") xml_dem_bce.SetName("numBCE") xml_dem_denom.SetName("denomination") xml_rapp_an.AddContent(2012) xml_rapp_trim.AddContent("trimestre2") xml_dem_bce.AddContent("0000.654.879") xml_dem_denom.AddContent("Denom") xml_root.addContent(xml_ds) xml_ds.addContent(xml_rapp_an) xml_rapp_an.addContent(xml_rapp_trim) xml_ds.addContent(xml_demandeur) xml_demandeur.addContent(xml_dem_ident) xml_dem_ident.addContent(xml_dem_bce) xml_dem_ident.addContent(xml_dem_denom)
Y a t'il une méthode plus simple, car là j'ai pas fini vu que j'en suis au tout début du xml.
Merci beaucoup
'code=pb' la balise est case sensitive: Merci de tout écrire en minuscules
Dernière modification par Sylvie de hannut (14-11-2012 09:46:03)
Hors ligne
Avec ce code j'ai 1 erreur avec la fct newdocument : "Bad number of arguments"
Qu'est-ce qui n'est pas juste, j'ai copié la commande dans "Question sur l'utilisation de PBDOM pour la création d'un fichier XML" ????
Hors ligne
Dois-je créer un PBDOM_element, faire un create, un setname et un addcontent, pour chaque balise??????
Ou alors je peux réutiliser un PBDOM_element pour tout mon xml ???????
Merci
Hors ligne
Il faut savoir que lorsqu'on crée un pbdom_element (par exemple pour ajouter un tag au document), une fois qu'on ajouté cet élément dans la structure on ne peut pas refaire un xml_root.addContent() pour le remettre ailleurs car pbdom indiquera qu'il a déjà un parent (à la rigueur, on peut utiliser le detach().
Pour construire tout un document
- soit tu crées autant de pbdom_element que de tags
- soit tu ne conserves qu'une variable et tu refais un destroy / create pour chaque tag
...dans un cas comme dans l'autre, ça semble un peu lourd si tu as beaucoup de balises. Il faudrait peut-être utiliser un autre moyen (datawindow/datastore, template de document où tu pourrais remplacer certaines portions par les données finales...) ?
Hors ligne
ok, merci beaucoup.
Ben j'avais pensé au datastore/datawindow external.
Je pensais y copier toutes les données utiles récupérées des DW remplies précédemment.
Mais comment faire pour crééer x fois le même groupe de données dans une DW external ???
Je m'explique, dans les dw existantes on affiche les données de personnes, mais naturellement il y a plusieurs personnes, je n'en connait pas le nb à la création de mon DS.
Je suis probablement pas claire, je sais, mais je ne sais pas comment m'expliquer.
Quand on part d'une DB, au retrieve je peux avoir plusieurs lignes détails, mais si je pars d'une dw external pouvant contenir plusieurs lignes X, ensuite une fois les lignes Y, puis plusieurs lignes de type Z. et ainsi de suite
Comment je peux créer ma DW ???
J'avais pensé aussi faire un DS ne contenant dans la zone détail qu'une zone texte et chaque ligne de mon XML était un record de mon DS, écrit explicitement (<nombalise valeur>) mais là un collègue m'a dit d'utiliser PBDOM
Vous avez tout l'historique de mes pensées
Hors ligne
j'ai choisi de travailler avec PBDOM et ça marche.
J'ai réussi à créer mes premières balises imbriquées.
Seul problème je n'arrive pas à créer les début du fichier XML soit
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> -<xs:annotation> <xs:documentation>Schema for DataStore produced by formulaire_Rapport_Trimestriel</xs:documentation> </xs:annotation>
Si quelqu'un sait comment faire je suis preneuse.
Merci beaucoup
Hors ligne
Qu'est-ce qui ne fonctionne pas ?
Pour ajouter le préfixe "ns:" ? (il faut chercher du côté du namespace, comme pour SetAttribute())
Hors ligne
Bonjour à tous
Pour le début de mon xml je n'arrive pas à avoir la balise schema complète, j'ai fait :
xml_doc.newdocument("schema") xml_doc.addcontent(xml_process) xml_root = xml_doc.getrootelement() xml_root.setattribute("schema","","cXML","http://www.w3.org/2001/XMLSchema",true)
j'ai essayé avec le dernier paramètre à false mais ça ne change pas, j'ai mis aussi "ns" comme param plutôt que "cXML", mais ça va pas non plus.
Que dois-je faire ?
Merci
Hors ligne
Je relis un peu le fil... et je m'interroge : tu essaies de fabriquer un fichier xml, ou un fichier xsd ?
Dans l'exemple que tu citais, le xsd qui est posté, c'est ce qui sert à valider ton xml, ou c'est ça que tu essaies de produire ? Dans ce cas, créer un xsd dynamiquement ma raît un peut bizarroïde
Hors ligne
?? ben heu non, je crée un xml ayant comme modèle le xsd reçu.
Et dans ce xsd reçu, il y a
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
je dois donc le mettre dans mon xml, ou pas ????
Suis perdue ... je connais pas grand chose en xml, et c'est mon 1er xml fait à la main
Dernière modification par Sylvie de hannut (15-11-2012 10:06:00)
Hors ligne
Oulà... ok
Alors un xsd (= xml schema definition) ça permet de valider un xml, une fois qu'on a déjà reçu ou fabriqué ce xml. Tout comme un DTD (= document type definition).
En gros c'est une sorte de grammaire qui spécifie quels sont les tags qui pourront être utilisés dans le xml, dans quel ordre, et pour chaque tag ou chaque attribut (les valeur="toto" qui suibent parfois le nom du tag) le type des valeurs, la liste des valeurs possibles, ou des règles de validation comme "positif", "non nul", ou encore des expressions régulières (ex : [a-z0-9]{5} )
Si je remonte à ton exemple j'apprends qu'il peut y avoir
- un élément "dataStore"
- cet élement est un "type complexe" (= une structure) qui pourra contenir des données composées de "anneeDuRapport" + "trimestreDuRapport", "demandeur"
- pour "anneeDuRapport" on spécifie que les valeurs possibles sont 2012..2016
- pour "trimestreDuRapport" on spécifie également une liste trimestre1..trimestre4
- etc
Le XML correspondant ressemblera à un truc du genre (en ajoutant un entête)
<?xml version="1.1" encoding="utf-16le" ?> <dataStore> <anneeDuRapport>2012</anneeDuRapport> <trimestreDuRapport>trimestre2</trimestreDuRapport> <demandeur> <identification> <numBCE>1234K567Z890</numBCE> <denomination>truc</denomination> </identification> </demandeur> <!-- ton xsd s'arrête là --> </dataStore>
Dernière modification par seki (15-11-2012 10:41:00)
Hors ligne
ah ok
Donc la ligne schem ..., ne dois pas se trouver dans le xml
Génial, je comprend enfin.
Merci beaucoup
Voici où j'en suis de mon xml, si je comprend bien, il est en bonne voie et y a rien à rajouté ??
<?xml version="1.0" encoding="UTF-8"?> -<schema>-<dataStore><anneeDuRapport>2009</anneeDuRapport><trimestreDuRapport>trimestre4</trimestreDuRapport>-<demandeur>-<identification><numBCE>0407771667</numBCE><denomination>C.P.A.S. de Ciger Ville</denomination></identification>-<adresse><rue>Place Communale</rue><numero>21</numero><boite/><cp>5190</cp><localite>Jemeppe-sur-Sambre</localite></adresse><service>aide aux familles</service><agrement>123</agrement><RGB>NON</RGB><amenagementFinCarriere>NON</amenagementFinCarriere>-<signaturePapier><nom>CHR</nom><prenom/><lieu>Jemeppe-sur-Sambre</lieu><date>15/11/2012</date></signaturePapier></demandeur>-<responsable>-<identification><civilite/><nom>CHR</nom><prenom/></identification>-<telecom><tel1>071/750075</tel1><tel2/><fax/></telecom><contactOuiNon>OUI</contactOuiNon></responsable><utilisationFormulaire>fluxXML</utilisationFormulaire>-<aidesFamiliales>-<item>-<identification><civilite/><nom>LUNE</nom><prenom>Etoile</prenom></identification><age/><immatriculation>00125</immatriculation><modeFinancement>S.P.W.</modeFinancement></item></aidesFamiliales></dataStore></schema>
Hors ligne
Tu y es presque !
...sauf que la racine de ton xml est "schema" et que ça devrait être "dataStore" (d'après le bout d'xsd que tu as donné).
3 remarques :
- il y a des '-' qui traînent dans le xml entre certains tags
- dans ton xml, je vois que numBCE = 0407771667, alors que dans le schéma on voit "<xs:pattern value="[0-1][0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9]"/>", les '.' valent pour n'importe quel caractère, il manquerait 2 caractères à ton code si tu essaies de valider le xml
- un schéma qui commence par "dataStore" c'est bizarre. C'est toi qui l'as fabriqué ?
Dernière modification par seki (15-11-2012 13:12:25)
Hors ligne
Non c'est le client qui a envoyé le schéma à suivre.
Merci pour tout tes conseils, c'est génial
Hors ligne
Sylvie de hannut a écrit:
Non c'est le client qui a envoyé le schéma à suivre.
Ok, il doit avoir un datastore prêt à charger le fichier xml, et il a généré le xsd à partir de celui-ci.
Content d'avoir pu dissiper quelques brumes et faire avancer le schmilblick
Hors ligne
Hello, je reviens vers vous après validation de mon XML par le client.
Voici la remarque qu'il m'envoie :
"Pour que le XSL soit valide, il faut que la première ligne soit
<dataStore xmlns:xs="http://www.w3.org/2001/XMLSchema">".
xml_doc = create PBDOM_Document xml_comment = create PBDOM_Comment xml_comment.setText("Schema for DataStore produced by formulaire_Rapport_Trimestriel") xml_process = create PBDOM_ProcessingInstruction xml_process.setname("xml") xml_process.setvalue("version", "1.0") xml_process.setvalue("encoding","utf-8") xml_doc.newdocument("dataStore") xml_doc.addcontent(xml_process) xml_root = xml_doc.getrootelement() xml_root.setattribute("xs","http://www.w3.org/2001/XMLSchema","cXML","http://www.w3.org/2001/XMLSchema",true) xml_root.addContent(xml_comment)
Apparement le setattribute ne fonctionne pas, voyez vous ce que je peux faire pour avoir le bon début de xml ????
Merci
Dernière modification par Sylvie de hannut (14-12-2012 09:07:36)
Hors ligne
Pour spécifier le namespace de ton document ( dans "xmlns", "ns" = "namespace") tu peux le spécifier avec la version longue de newdocument() avec un code du genre (non testé) :
xml_doc.newdocument("xs", "http://www.w3.org/2001/XMLSchema", "dataStore", "", "")
Hors ligne
Je viens d'essayer ta commande, PB me dit "bad number of arguments for function: newdocument"
J'ai déjà eu le problème en essayant la commande
string strXML = "<dataStore xmlns = ~"http://www.w3.org/2001/XMLSchema~">" xml_buildr = Create PBDOM_Builder xml_doc = xml_buildr.BuildFromString(strXML)
Pb m'a dit qu'il ne connait pas la fct buildFromString, j'ai essayé avec build et là c'est passé à la compil, mais j'ai toujours pas mon paramètre dans le XML.
Je ne comprend pas
J'ai la version 9.0.3 Build 8511
Hors ligne
Sylvie de hannut a écrit:
Je viens d'essayer ta commande, PB me dit "bad number of arguments for function: newdocument"
[...]
Je ne comprend pas
J'ai la version 9.0.3 Build 8511
Je viens de regarder dans la doc de PB9 (9.0 b5507), cette méthode existe bien en 2 versions : une courte avec 1 paramètre et une longue avec 5 paramètres.
Tu pourrais coller ton appel à NewDocument() pour voir ?
Hors ligne