IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Création d'une classe php sur base d'un schéma xsd


Sujet :

Langage PHP

  1. #1
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut Création d'une classe php sur base d'un schéma xsd
    Bonjour à tous,

    Il est très rare que je pose une question mais, là, après plus d'une semaine de recherches et d'essais, je viens vous demander de l'aide.

    La question, en soi, est très simple:
    Comment, sous Windows, créer une classe php en partant d'un xsd?

    Je me bats, depuis plus d'une semaine, pour essayer de faire fonctionner les "solutions" trouvées sur le net.
    La majorité des liens renvoient vers https://github.com/goetas/xsd2php ou https://github.com/goetas-webservices/xsd2php.

    J'ai beau essayer de suivre les recommandations de l'auteur, il vient toujours un moment où "ça ne marche pas".
    J'ai compris l'usage du Composer et arrive à "composer" à partir du composer.json fourni.

    Là ou je cale, c'est dans la partie Usage.
    Soit les fichiers invoqués ne sont pas où ils sont censés être, soit les syntaxes utilisées sont destinées à un environnement Linux et, quand il y a un fichier batch, il faut corriger les chemins écrits avec des "/" au lieu de "\".
    Quoi que j'essaie de corriger, je tombe sur de nouvelles erreurs.
    Ce qui n'aide pas, c'est que dans l'arborescence des fichiers, il y a plusieurs "bin" et plusieurs fichiers "xsd2php".

    goetas propose bien une démo fonctionnelle mais elle est basée sur l'interrogation d'un site web qui ne répond plus comme attendu et je ne sais pas comment modifier pour ouvrir mon fichier xsd en local.

    Ma question prend donc plusieurs formes (pistes).
    • Quelqu'un peut-il m'aider à faire fonctionner un des convertisseurs présents sur le net?
    • Existe-t-il un convertisseur qui ne demande pas 36 étapes d'installation et de configuration pour fonctionner?
    • Plus simple: Peut-on trouver une classe "toute faite" correspondant au schéma joint (pain.001.001.03)?

    Je joins un exemple d'xsd que je cherche à transformer en classe php.

    Je tiens à préciser que je débute en php. Je suis développeur VBA et VB.NET et mon but final est de réécrire en php des routines existantes et fonctionnelles en .NET.
    Soyez donc indulgents si je ne comprends pas immédiatement certaines "évidences" pour un développeur php.

    Evidemment, vu le temps déjà passé, je pourrais écrire la classe manuellement mais je ne sais pas comment le faire correctement.

    Donc, si ça inspire quelqu'un de me montrer 2 - 3 exemples de (sous) classes.

    Pour ceux à qui ça parle, voici 2 exemples de ces classes en VB.NET:
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Partial Public Class CustomerCreditTransferInitiationV03
     
        Private grpHdrField As GroupHeader32
     
        Private pmtInfField() As PaymentInstructionInformation3
     
        '''<remarks/>
        Public Property GrpHdr() As GroupHeader32
            Get
                Return Me.grpHdrField
            End Get
            Set
                Me.grpHdrField = value
            End Set
        End Property
     
        '''<remarks/>
        <System.Xml.Serialization.XmlElementAttribute("PmtInf")>  _
        Public Property PmtInf() As PaymentInstructionInformation3()
            Get
                Return Me.pmtInfField
            End Get
            Set
                Me.pmtInfField = value
            End Set
        End Property
    End Class

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Partial Public Class ActiveOrHistoricCurrencyAndAmount
     
        Private ccyField As String
     
        Private valueField As Decimal
     
        '''<remarks/>
        <System.Xml.Serialization.XmlAttributeAttribute()>  _
        Public Property Ccy() As String
            Get
                Return Me.ccyField
            End Get
            Set
                Me.ccyField = value
            End Set
        End Property
     
        '''<remarks/>
        <System.Xml.Serialization.XmlTextAttribute()>  _
        Public Property Value() As Decimal
            Get
                Return Me.valueField
            End Get
            Set
                Me.valueField = value
            End Set
        End Property
    End Class

    J'aimerais avoir la traduction de ces classes en php.
    Je joins aussi la classe VB (zippée) si ça peut aider.

    Un très grand merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    J'ai un peu avancé.
    Vu que la conversion xsd vers classe php semble très difficile à réaliser (en tout cas pour moi), j'ai utilisé XMLSPY pour convertir l'xsd en json puis utiliser json_decode.

    Pas mieux. Le résultat est une stdclass. Ce qui ne me convient pas.

    J'ai besoin d'une classe sur une instance de laquelle je peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $jsonContent->asXML($dir .'\output.xml')
    pour générer un fichier xml en finale.

  3. #3
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    J'avoue ne pas avoir tout compris. Tu as besoin d'une classe pour valider un fichier xml ? Pour en créer un ?

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Déjà, merci d'avoir répondu même si c'est pour poser une question.

    Explication du but final:
    J'ai développé une application en VB.NET qui crée des fichiers xml à partir de fichiers Excel.
    La technique que j'y ai utilisée est de
    • convertir l'XSD de définition des fichier xml en une classe VB avec l'utilitaire xsd.exe de Microsoft
    • créer une instance de la classe VB
    • lire le fichier Excel et remplir les différents attributs de l'instance créée
    • créer le fichier xml par un simple serializer.Serialize(myFileStream, objFile.Doc)

    Aujourd'hui, je cherche à faire la même chose en dynamique sur un site.
    J'essaie donc d'appliquer la même technique:
    • convertir l'XSD de définition des fichier xml en une classe php
    • créer une instance de la classe php
    • lire le fichier Excel et remplir les différents attributs de l'instance créée
    • créer le fichier xml par un simple $ok = $objxml->asXML($dir .'\output.xml');

    C'est sur la première étape que je cale.
    En cherchant sur Internet, je trouve plusieurs réponses qui renvoient à des solutions sur GitHub et je n'arrive pas à faire fonctionner ces solutions.
    J'arrive à utiliser composer pour charger tous les fichiers nécessaires puis je suis bloqué dans la manière d'utiliser ces fichiers (librairies).

    Donc, toute aide à propos de comment arriver à créer un objet php sur base d'un XSD sera très appréciée.
    Peu importe la technique, même si je dois créer la classe à la main. Mais la conversion finale $objxml->asXML doit me donner le fichier xml correct correspondant aux définitions de l'XSD.

    Edit:
    Je trouve bien ce code https://searchcode.com/codesearch/view/16965257/
    Mais il nécessite le fichier phpClass.php. Où le trouver?

    ReEdit:
    Le lien qui semble le plus prometteur est https://github.com/goetas/xsd2php
    Comment utiliser ces librairies?

    Je ne comprends pas l'exemple d'utilisation donné par l'auteur:
    Generate PHP classes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vendor/bin/xsd2php convert:php \
    `/home/my/ota/OTA_HotelAvail*.xsd \
     
    --ns-map='http://www.opentravel.org/OTA/2003/05;Mercurio/OTA/2007B/' \
     
    --ns-dest='Mercurio/OTA/2007B/;src/Mercurio/OTA/V2007B' \
     
    --alias-map='http://www.opentravel.org/OTA/2003/05;CustomOTADateTimeFormat;Vendor/Project/CustomDateClass'
    Il n'y a pas de répertoire bin sous vendor.
    Bref, je tourne en rond.

  5. #5
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    Edit:
    Je trouve bien ce code https://searchcode.com/codesearch/view/16965257/
    Mais il nécessite le fichier phpClass.php. Où le trouver?
    En début de code, on peut lire : namespace com\mikebevz\xsd2php;.
    Si je cherche "mikebevz xsd2php" sur Google, j'obtiens ce lien : https://github.com/IntuitDeveloper/o...kebevz/xsd2php.
    J'ai récupéré les fichiers, puis les ai placés dans un dossier dans lequel j'ai ajouté le fichier de test initial "pain.001.001.03.xsd", ainsi qu'un fichier php de test où j'ai écrit ce code (j'ai regardé sommairement "Xsd2Php.php" pour voir quelles méthodes utiliser) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    require 'Xsd2Php.php';
    $xsd2php=new com\mikebevz\xsd2php\Xsd2Php(null,'pain.001.001.03.xsd');
    //$xsd2php->saveClasses('classes',true); //génère un dossier "classes" contenant 116 fichiers php
    $xsd2php->dom->save('pain.001.001.03_ini.xml');
    $xsd2php->getXML()->save('pain.001.001.03.xml'); //xml remanié à partir du fichier "xsd2php2.xsl"
    ?>
    Je ne sais pas si cela correspond précisément à la demande, que je n'ai pas étudiée en détail, ce sera éventuellement un point de départ.

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour Loralina,

    Merci pour les recherches.
    Là, je suis au travail et j'ai peu de temps pour regarder.
    Je t'ai déjà mis un Nom : poucehaut.gif
Affichages : 654
Taille : 238 octets pour le temps passé.

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonsoir,

    J'ai pu lancer le test et ça semble assez prometteur.
    J'ai décommenté la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xsd2php->saveClasses('classes',true);
    et j'obtiens bien une classe par objet du fichier XSD.

    Il faut maintenant que je les analyse pour essayer de comprendre certains détails.
    Comme je suis débutant en php (pour des raisons historique, je suis développeur VBA et VB.NET), ça risque de prendre un peu de temps mais certainement moins que de tout écrire à la main.
    J'ai déjà 2 questions par rapport au contenu:
    • Je suis étonné que les attributs soient public mais je suppose que c'est un choix de l'auteur.
      Qu'en penses-tu?
    • Dans la classe CustomerCreditTransferInitiationV03, $PmtInf devrait être un array.
      Petit bug de l'outil? Ou je n'ai pas compris comment utiliser ces classes?


    Dans l'exemple que tu m'as fourni, j'aimerais comprendre cette syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xsd2php=new com\mikebevz\xsd2php\Xsd2Php(null,'pain.001.001.03.xsd');
    A quoi se réfère com\mikebevz\xsd2php\?
    Ca ne peut pas être un chemin sur le disque dur puisque je n'ai pas de répertoire com.
    Comme tu peux t'en rendre compte, ma connaissance est quasi nulle en matière de NameSpaces.

  8. #8
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    Pour les espaces de noms, le mieux sera de se reporter à la documentation :
    http://php.net/manual/fr/language.na....rationale.php
    http://php.net/manual/fr/language.namespaces.basics.php
    etc.

    Pour le reste, j'ai peu de temps pour regarder et je n'ai jamais manipulé de xsd.
    Rapidement :
    Je suis étonné que les attributs soient public mais je suppose que c'est un choix de l'auteur.
    Qu'en penses-tu?
    Cela les rend accessibles, je ne vois pas où est le problème.
    Je pense que ce sera requis pour créer du xml à partir d'instances des classes.

    Dans la classe CustomerCreditTransferInitiationV03, $PmtInf devrait être un array.
    Petit bug de l'outil? Ou je n'ai pas compris comment utiliser ces classes?
    Un début d'exemple peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    namespace com\mikebevz\xsd2php;
    require 'Xsd2Php.php';
    require 'Php2Xml.php';
    $xsd2php=new Xsd2Php(null,'pain.001.001.03.xsd');
    $xsd2php->saveClasses('classes',true);
    require 'classes/CustomerCreditTransferInitiationV03.php';
    require 'classes/PaymentInstructionInformation3.php';
    $php2Xml=new Php2Xml(null);
    file_put_contents('CustomerCreditTransferInitiationV03.xml',$php2Xml->getXml(
    	new \CustomerCreditTransferInitiationV03([
    		'GrpHdr'=>'test',
    		'PmtInf'=>array(
    			new \PaymentInstructionInformation3(['PmtInfId'=>1]),
    			new \PaymentInstructionInformation3(['PmtInfId'=>2]))])));
    ?>
    Fichier obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8"?>
    <CustomerCreditTransferInitiationV03 xmlns:ns0="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
      <ns0:GrpHdr>test</ns0:GrpHdr>
      <ns0:PmtInf>
        <ns0:PmtInfId>1</ns0:PmtInfId>
      </ns0:PmtInf>
      <ns0:PmtInf>
        <ns0:PmtInfId>2</ns0:PmtInfId>
      </ns0:PmtInf>
    </CustomerCreditTransferInitiationV03>

  9. #9
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Encore merci.

    Chaque piste me fait avancer.

    J'avais effectivement commencé à lire les notions de namespace dans le manuel php.
    Je continue...

  10. #10
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    C'est absolument génial!

    J'ai rassemblé toutes les classes générées dans un seul fichier pour éviter 116 require et fait tourner ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    namespace com\mikebevz\xsd2php;
    require 'Php2Xml.php';
    require 'classes/pain.001.001.03.php';
    $php2Xml=new Php2Xml(null);
    file_put_contents('out.xml',$php2Xml->getXml(
    	new \CustomerCreditTransferInitiationV03([
    		'GrpHdr'=>'test',
    		'PmtInf'=>array(
    			new \PaymentInstructionInformation3(['PmtInfId'=>1]),
    			new \PaymentInstructionInformation3(['PmtInfId'=>2]))])));
    ?>
    Et le résultat est le même que ton exemple.

    Il me reste une question qui me travaille.
    D'où vient xmlns:ns0="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 présent dans le fichier de sortie?
    Je ne le vois ni dans le code exécuté ni dans la classe.
    Enfin, si. Je le vois dans des commentaires. Ces derniers sont-ils lus et interprétés?

    Quoi qu'il en soit, et même si tu n'as pas le temps de me répondre, un énorme merci et je continue à me documenter.

    Edit:
    J'ai trouvé.
    Effectivement, php2xml lit les commentaires et recherche la string 'xmlNamespace'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle techno pour faire une IHM pour appli php sur base sql server
    Par droliprane dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 01/02/2016, 00h40
  2. Création d'une classe de base pour les ChildWindow
    Par Mozofeuk dans le forum Silverlight
    Réponses: 4
    Dernier message: 15/11/2011, 14h42
  3. [MySQL] comprendre une connexion php sur une base SQL
    Par gillot007 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/12/2008, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo