Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'ai un fichier sur lequel je dois associer un fichier XSD afin de vérifier son parsing.
Cà fonctionnait depuis pas mal de temps, mais on m'a transmis un cas ou l'affectation du schéma XSD purge le fichier ...
A priori cela serait dû à la balise <?xml version="1.0"?> car le fichier est correctement intégré si on la retire
Exemple fichier KO :
<?xml version="1.0"?> <com xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <cod_soc>ITM</cod_soc> <cod_eta>COMI</cod_eta> ... </com>
Je transmets le code qui affecte le schéma. Le GetrootElement fonctionne bien.
Il semble que ce soit le pbdom_doc.SaveDocument qui pose souci car il renvoie FALSE.
Et le PBXRuntimeError renvoie : Exception-Error calling method of a PBNI object
String ls_file_xml, ls_file_xsd PBDOM_BUILDER pbdom_bldr pbdom_DOCUMENT pbdom_doc PBDOM_ATTRIBUTE pbdom_attr_array[] PBDOM_ELEMENT pbdom_elem_root PBDOM_ATTRIBUTE pbdom_attr1 , pbdom_attr2 ls_file_xml="C:\temp\Monfichier.xml" ls_file_xsd = Trim(GetCurrentDirectory()) + "\ITF_CMD_IN_V6R1.xsd" TRY pbdom_bldr = Create PBDOM_Builder pbdom_doc = pbdom_bldr.BuildFromFile(ls_file_xml) //on recupère le tag racine pbdom_elem_root = pbdom_doc.getrootelement( ) //suppression des attributs en particulier la declaration du schema pbdom_elem_root.getattributes( ref pbdom_attr_array) ll_max = upperbound (pbdom_attr_array) FOR ll_i =1 to ll_max pbdom_elem_root.removeattribute(pbdom_attr_array[ll_i] ) NEXT // suppression (si elle existe) de la declaration de l'espace de nom pbdom_elem_root.removenamespacedeclaration( pbdom_elem_root.getnamespaceprefix( ) , pbdom_elem_root.getnamespaceuri( )) // on met la bonne pbdom_elem_root.addnamespacedeclaration( "xsi", "http://www.w3.org/2001/XMLSchema-instance" ) // creation de l'attibut du schema pbdom_attr2 = CREATE PBDOM_ATTRIBUTE pbdom_attr2.setname( "noNamespaceSchemaLocation") pbdom_attr2.setnamespace( "xsi", "noNamespace" ,FALSE) pbdom_attr2.settext(ls_file_xsd ) pbdom_elem_root.setattribute(pbdom_attr2) //on enregistre ces changements lb_xsdok = pbdom_doc.SaveDocument(ls_file_xml ) CATCH (PBDOM_EXCEPTION pbdom_except) ... CATCH ( PBXRuntimeError re ) ...
Quelqu'un aurait une idée ?
Edit: ajout de la syntaxe PB
Dernière modification par Sebastouche (05-04-2013 14:39:53)
Hors ligne
Je me suis permis de rajouter la colorisation du code PB
Hors ligne
seki a écrit:
Je me suis permis de rajouter la colorisation du code PB
Pas de souci, si çà peut me décoinçer ...
Hors ligne
Sebastouche a écrit:
Il semble que ce soit le pbdom_doc.SaveDocument qui pose souci car il renvoie FALSE.
Et le PBXRuntimeError renvoie : Exception-Error calling method of a PBNI object
Je me pose trois questions
1) ça retourne FALSE ou ça lève une exception ? (à ma connaissance pas les deux en même temps).
2) c'est un changement de comportement sans modification du code ni du XSD qui cause ce problème ?
3) l’élément root avait son propre namespace, pourquoi utiliser la méthode "noNamespaceSchemaLocation" ?
Hors ligne
Sebastouche a écrit:
Il semble que ce soit le pbdom_doc.SaveDocument qui pose souci car il renvoie FALSE.
Et le PBXRuntimeError renvoie : Exception-Error calling method of a PBNI object
En plus des remaques d'xlat sur le retour faux + une exception, tu montres les lignes "CATCH" dans le code PB, mais on ne voit pas de ligne "TRY" : quelle est la portion de code protégé par le TRY/CATCH ?
Hors ligne
En réponse à vos questions :
1) ça retourne FALSE ou ça lève une exception ? (à ma connaissance pas les deux en même temps).
Ben là, çà retourne les deux ...
2) c'est un changement de comportement sans modification du code ni du XSD qui cause ce problème ?
Non, ni le code, ni le fichier XSD n'ont été modifiés.
3) l’élément root avait son propre namespace, pourquoi utiliser la méthode "noNamespaceSchemaLocation" ?
J'ai récupéré le traitement, mais les fichiers pouvant provenir de clients différents, c'est peut-être pour çà que le namespace est supprimé ?
4) quelle est la portion de code protégé par le TRY/CATCH ?
Erreur de copier-coller. J'ai ajouté le TRY
Petits détails :
- c'est en PB 10.5.2 ...
- je maitrise mal le XML ...
Seb
Hors ligne
J'ai résolu mon souci de purge de fichier.
A priori, çà a l'air de fonctionner pour mes cas de tests.
je remplace la précédente ligne SaveDocument par le code qui suit :
ls_xml = pbdom_doc.SaveDocumentIntoString() pbdom_bldr2 = Create PBDOM_Builder pbdom_doc2 = pbdom_bldr2.buildfromstring( ls_xml) lb_xsdok = pbdom_doc2.SaveDocument(ls_file_xml)
Hors ligne
Gni ?
Hors ligne
C'est à dire ?
seki a écrit:
Gni ?
Hors ligne
Ça paraît juste bizarre :
- tu prends le résultat sous forme xml texte de ton document
- tu le passes en source à un nouvel objet dom builder
- pour le re-sauver en xml texte...
Je trouve ça louche comme façon de "tomber en marche"
Hors ligne
Pour débloquer une situation plus que tendue ( ), j'ai trouvé cette solution.
Cependant, je suis ouvert à toute autre proposition qui me permette de parser des fichiers XML avec un XSD.
seki a écrit:
Ça paraît juste bizarre :
- tu prends le résultat sous forme xml texte de ton document
- tu le passes en source à un nouvel objet dom builder
- pour le re-sauver en xml texte...
Je trouve ça louche comme façon de "tomber en marche"
Hors ligne