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

Valider XML Discussion :

[XSD]Validation avec deux schémas?


Sujet :

Valider XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 41
    Points
    41
    Par défaut [XSD]Validation avec deux schémas?
    Bonjour, j'ai un fichier XML (command.xml) qui possède deux schémas xsd
    (env.xsd et mess.xsd).
    Voici un peu de code de env.xsd:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?xml version="1.0" encoding="UTF-8"?>
        <ENVELOPPE xmlns="urn:x-csrp:fr.csrp.protocole:env" Nature_Action="REQ_EMISSION" >
     
          <ENTETE>
            <EMETTEUR Nature="OF" Id="test" Adresse="test" />
            <RECEPTEUR Nature="RE" Code="11" Id="A1" Adresse="test5" />
            <REF_MESSAGE>
              M050215120338q191
            </REF_MESSAGE>
            <EN_REPONSE_A>
            	TEST1
            </EN_REPONSE_A>
          </ENTETE>
          <CORPS>
            <MESSAGExmlns="urn:x-csrp:fr.csrp.protocole:mess">
              <ENTETE>
                <EMETTEUR Id_Client="test"/>
                <DESTINATAIRE Code_Societe="11" Id_Societe="A1"/>
              </ENTETE>
              <CORPS>
                <COMMANDE Ref_Cde_Client="00000" Commentaire_General="C1ZO">
                  <NORMALE>
                    <LIGNE_N Num_Ligne="1" Type_Codification="1111" Code_Produit="00115" Quantite="16"/>
                    <LIGNE_N Num_Ligne="2" Type_Codification="1002" Code_Produit="00011" Quantite="22"/>
     
                  </NORMALE>
                </COMMANDE>
                <COMMANDE Ref_Cde_Client="123456" Commentaire_General="TEST">
                  <NORMALE>
                    <LIGNE_N Num_Ligne="1" Type_Codification="CODE1" Code_Produit="0000001" Designation="Produit Test 1" Quantite="1"/>
                    <LIGNE_N Num_Ligne="2" Type_Codification="CODE2" Code_Produit="0000002" Designation="Produit Test 2" Quantite="2"/>
                    <LIGNE_N Num_Ligne="3" Type_Codification="CODE3" Code_Produit="0000003" Designation="Produit Test 3" Quantite="3"/>
                    <LIGNE_N Num_Ligne="4" Type_Codification="CODE4" Code_Produit="0000004" Designation="Produit Test 4" Quantite="4"/>
                  </NORMALE>
                </COMMANDE>
              </CORPS>
            </MESSAGE>
          </CORPS>
        </ENVELOPPE>
    En fait le env.xsd traite ENVELOPPE et ses noeuds entete recepteur et mess.xsd traite tous les noeuds de message.

    Je tiens à dire que ce n'est pas moi qui est créer ces fichiers.

    Le problème c'est que ni env.xsd ne fais appel à mess.xsd ni mess.xsd ne fais appel à env.xsd.

    Alors pour la validation que je dois faire via php5 je bloque ...
    Une idée?

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Tu n'as pas d'autre choix que de faire un <xsd:import> d'un schéma dans l'autre, donc de modifier un de tes schémas.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Ok mais apparemment il n'y a rien à rajouter, la personne qui a créer cela a dit que tout est dedans rien à rajouter.

    Je débute en XML alors peut être qu'il y a un autre moyen mais là je sèche.
    Merci quand même de ta réponse.

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Toutes mes excuses, j'ai répondu trop vite avant de m'apercevoir que tes deux schémas concernaient des espaces de noms différents.

    Il faut que dans l'élément racine de ton document XML tu déclares à quel espace de nom correspond chaque schéma dans l'attribut schemaLocation, en alternant espaces de nom et schémas de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ENVELOPPE 
      xmlns="urn:x-csrp:fr.csrp.protocole:env" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="urn:x-csrp:fr.csrp.protocole:env env.xsd urn:x-csrp:fr.csrp.protocole:mess mess.xsd"
      Nature_Action="REQ_EMISSION" >
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Je vais essayer.

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Je travaille sur la suite du projet commencé par Cuber, et je me retrouve confronté au même problème.

    Le projet se déroule en 3 étapes :

    1) Réception du fichier XML par le flux HTTP
    2) Analyse et taitement du fichier
    3) Retour de la réponse, touours par HTTP

    Voici le fichier que je reçois :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <?xml version="1.0" encoding="UTF-8"?>
    <CSRP_ENVELOPPE xmlns="urn:x-csrp:fr.csrp.protocole:enveloppe" Nature_Action="REQ_EMISSION" Version_Protocole="1.0.0.0" Id_Logiciel="WinPharma" Version_Logiciel="5.3.31" Usage="P">
    <ENTETE>
    <EMETTEUR Nature="OF" Code="00" Id="123456" Adresse="17 chauss饠de la madeleine  44000 NANTES"/>
    <RECEPTEUR Nature="RE" Code="13" Id="123456" Adresse="TRALALA"/>
    <REF_MESSAGE>7D509140A8C6057</REF_MESSAGE>
    <DATE>2005-09-20T16:00:06</DATE>
    </ENTETE>
    <CORPS>
    <MESSAGE_OFFICINE xmlns="urn:x-csrp:fr.csrp.protocole:message">
    <ENTETE>
    <EMETTEUR Nature_Partenaire="OF" Id_Client="123456"/>
    <DESTINATAIRE Code_Societe="RE" Id_Societe="123456"/>
    </ENTETE>
    <CORPS>
    <COMMANDE Ref_Cde_Client="4020">
    <NORMALE>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3095969" Quantite="2"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3096420" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3098608" Quantite="3"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3102250" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3105308" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3107690" Quantite="2"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3107709" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3113443" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3129332" Quantite="1"/>
    </NORMALE>
    </COMMANDE>
    </CORPS>
    </MESSAGE_OFFICINE>
    </CORPS>
    </CSRP_ENVELOPPE>
    Je fais appel à la librairie DOM-XML pour récupérer les informations dont j'ai besoin.


    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
    17
    18
    19
    20
    21
    22
    23
     
    <?
     
    $fichier = 'commande.xml';
     
    //Je commence par instancier ma classe
    $dom_=new DOMDocument();
     
    //Je charge le fichier
    $dom_->load($fichier);
     
    /**** JUSQ'ICI TOUT VA BIEN ****/
     
    // Je parcours le fichier
    $xpath = new DOMXpath($dom);
     
    // Je définis mon chemin
    $res_req= $xpath->query('/CSRP_ENVELOPPE/CORPS/MESSAGE_OFFICINE/ENTETE/EMETTEUR');
     
    // Je récupère l'attribut
    $Id_Client =$res_req->item(0)->getAttribute('Id_Client');
     
    ?>
    A l'exécution, voici l'erreur retournée :

    Fatal error: Call to a member function getAttribute() on a non-object in c:\Inetpub\wwwroot\test_xml.php on line 74

    Après plusieurs arrachages de cheveux, je parviens à récupérer l'attribut mais en modifiant le fichier XML de départ comme GrandFather le préconisait.

    Voici le fichier XML modifié (seules les balises <CSRP_ENVELOPPE> et <MESSAGE_OFFICINE> sont concernées) :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <?xml version="1.0" encoding="UTF-8"?>
    <CSRP_ENVELOPPE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Nature_Action="REQ_EMISSION" Version_Protocole="1.0.0.0" Id_Logiciel="WinPharma" Version_Logiciel="5.3.12" Usage="P" xsi:noNamespaceSchemaLocation="E:\test_jeremy\integration\valid.xsd">
    <ENTETE>
    <EMETTEUR Nature="OF" Code="00" Id="123456" Adresse="17 chauss饠de la madeleine  44000 NANTES"/>
    <RECEPTEUR Nature="RE" Code="13" Id="123456" Adresse="TRALALA"/>
    <REF_MESSAGE>7D509140A8C6057</REF_MESSAGE>
    <DATE>2005-09-20T16:00:06</DATE>
    </ENTETE>
    <CORPS>
    <MESSAGE_OFFICINE>
    <ENTETE>
    <EMETTEUR Nature_Partenaire="OF" Id_Client="123456"/>
    <DESTINATAIRE Code_Societe="RE" Id_Societe="123456"/>
    </ENTETE>
    <CORPS>
    <COMMANDE Ref_Cde_Client="4020">
    <NORMALE>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3095969" Quantite="2"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3096420" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3098608" Quantite="3"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3102250" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3105308" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3107690" Quantite="2"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3107709" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3113443" Quantite="1"/>
    <LIGNE_N Num_Ligne="1" Type_Codification="CIP39" Code_Produit="3129332" Quantite="1"/>
    </NORMALE>
    </COMMANDE>
    </CORPS>
    </MESSAGE_OFFICINE>
    </CORPS>
    </CSRP_ENVELOPPE>
    Le problème c'est que je ne suis pas censé modifier le fichier XML que je reçois, et je ne vois même pas pourquoi ça pose un problème dans la récupération de l'attribut?

    Merci beaucoup de vos réponses!

    ps : comme Cuber je ne suis malheureusement pas un spécialiste du XML...

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    peux-tu donner le <CSRP_ENVELOPPE> original ?
    A priori, cela n'a rien à voir avec les W3C XML Schemas : ils ne sont pas implémentés dans PHP 5.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    peux-tu donner le <CSRP_ENVELOPPE> original ?
    Je ne suis pas sûr de bien saisir.

    Le fichier original c'est celui que je reçois (au format XML); c'est également celui que j'ai modifié pour récupérer l'attribut souhaité.

    Dans mon dernier post tu peux voir ces deux fichiers.

    Par contre si tu parles des fichiers XSD de validation les voici :

    Fichier csrp-enveloppe-specv4.8.xsd :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com)  -->
    <xsd:schema targetNamespace="urn:x-csrp:fr.csrp.protocole:enveloppe" xmlns="urn:x-csrp:fr.csrp.protocole:enveloppe" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    	<!--Schema enveloppe conforme aux spécifications Pharma-ML v4.8-->
    	<!--Définition des éléments globaux-->
    	<xsd:element name="CSRP_ENVELOPPE">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element name="ENTETE">
    					<xsd:complexType>
    						<xsd:sequence>
    							<xsd:element name="EMETTEUR">
    								<xsd:complexType>
    									<xsd:attributeGroup ref="attgPartenaire"/>
    								</xsd:complexType>
    							</xsd:element>
    							<xsd:element name="RECEPTEUR">
    								<xsd:complexType>
    									<xsd:attributeGroup ref="attgPartenaire"/>
    								</xsd:complexType>
    							</xsd:element>
    							<xsd:element name="REF_MESSAGE" type="stMessageId"/>
    							<xsd:element name="EN_REPONSE_A" type="stMessageId" minOccurs="0"/>
    							<xsd:element name="DATE" minOccurs="0">
    								<xsd:annotation>
    									<xsd:documentation>date et heure d'émission du message à la précision seconde</xsd:documentation>
    								</xsd:annotation>
    								<xsd:simpleType>
    									<xsd:restriction base="xsd:dateTime">
    										<xsd:pattern value=".+T[^Z+-\.]+"/>
    									</xsd:restriction>
    								</xsd:simpleType>
    							</xsd:element>
    						</xsd:sequence>
    					</xsd:complexType>
    				</xsd:element>
    				<xsd:element name="CORPS">
    					<xsd:complexType>
    						<xsd:choice>
    							<xsd:element name="ERREUR">
    								<xsd:complexType>
    									<xsd:attribute name="Description_libre" use="required">
    										<xsd:simpleType>
    											<xsd:restriction base="xsd:string">
    												<xsd:maxLength value="128"/>
    												<xsd:minLength value="1"/>
    											</xsd:restriction>
    										</xsd:simpleType>
    									</xsd:attribute>
    								</xsd:complexType>
    							</xsd:element>
    							<xsd:element name="ACTION">
    								<xsd:annotation>
    									<xsd:documentation>Action de cinématique : ACQUITTEMENT, VIDAGE ou FIN_SERVICE</xsd:documentation>
    								</xsd:annotation>
    								<xsd:simpleType>
    									<xsd:restriction base="xsd:NMTOKEN">
    										<xsd:enumeration value="ACQUITTEMENT"/>
    										<xsd:enumeration value="VIDAGE"/>
    										<xsd:enumeration value="FIN_SERVICE"/>
    									</xsd:restriction>
    								</xsd:simpleType>
    							</xsd:element>
    							<xsd:any namespace="##other" processContents="strict"/>
    						</xsd:choice>
    						<xsd:anyAttribute namespace="##other" processContents="strict"/>
    					</xsd:complexType>
    				</xsd:element>
    			</xsd:sequence>
    			<xsd:attribute name="Version_Protocole" use="required">
    				<xsd:simpleType>
    					<xsd:restriction base="xsd:string">
    						<xsd:pattern value="\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1,2}"/>
    					</xsd:restriction>
    				</xsd:simpleType>
    			</xsd:attribute>
    			<xsd:attribute name="Nature_Action" use="required">
    				<xsd:simpleType>
    					<xsd:restriction base="xsd:string">
    						<xsd:enumeration value="REQ_EMISSION"/>
    						<xsd:enumeration value="REQ_RECEPTION"/>
    						<xsd:enumeration value="REP_EMISSION"/>
    						<xsd:enumeration value="REP_RECEPTION"/>
    					</xsd:restriction>
    				</xsd:simpleType>
    			</xsd:attribute>
    			<xsd:attribute name="Id_Logiciel" use="required">
    				<xsd:simpleType>
    					<xsd:restriction base="xsd:normalizedString">
    						<xsd:minLength value="1"/>
    						<xsd:maxLength value="30"/>
    					</xsd:restriction>
    				</xsd:simpleType>
    			</xsd:attribute>
    			<xsd:attribute name="Version_Logiciel" use="required">
    				<xsd:simpleType>
    					<xsd:restriction base="xsd:normalizedString">
    						<xsd:minLength value="1"/>
    						<xsd:maxLength value="10"/>
    					</xsd:restriction>
    				</xsd:simpleType>
    			</xsd:attribute>
    			<xsd:attribute name="Usage" use="required">
    				<xsd:annotation>
    					<xsd:documentation>Indique nature production ou test du message</xsd:documentation>
    				</xsd:annotation>
    				<xsd:simpleType>
    					<xsd:restriction base="xsd:NMTOKEN">
    						<xsd:length value="1"/>
    					</xsd:restriction>
    				</xsd:simpleType>
    			</xsd:attribute>
    		</xsd:complexType>
    	</xsd:element>
    	<!--Définition des types simples-->
    	<xsd:simpleType name="stMessageId">
    		<xsd:restriction base="xsd:normalizedString">
    			<xsd:minLength value="1"/>
    			<xsd:maxLength value="20"/>
    		</xsd:restriction>
    	</xsd:simpleType>
    	<!--Définition des groupes d'attribut-->
    	<xsd:attributeGroup name="attgPartenaire">
    		<xsd:attribute name="Nature" use="required">
    			<xsd:simpleType>
    				<xsd:restriction base="xsd:NMTOKEN">
    					<xsd:enumeration value="RE"/>
    					<xsd:enumeration value="OF"/>
    				</xsd:restriction>
    			</xsd:simpleType>
    		</xsd:attribute>
    		<xsd:attribute name="Code" use="optional" default="00">
    			<xsd:annotation>
    				<xsd:documentation>Obligatoire si nature partenaire
    est RE (répartiteur), la valeur par défaut est utilisée pour partenaire OF (Officine)</xsd:documentation>
    			</xsd:annotation>
    			<xsd:simpleType>
    				<xsd:restriction base="xsd:NMTOKEN">
    					<xsd:length value="2"/>
    				</xsd:restriction>
    			</xsd:simpleType>
    		</xsd:attribute>
    		<xsd:attribute name="Id" use="required">
    			<xsd:simpleType>
    				<xsd:restriction base="xsd:NMTOKEN">
    					<xsd:minLength value="1"/>
    					<xsd:maxLength value="20"/>
    				</xsd:restriction>
    			</xsd:simpleType>
    		</xsd:attribute>
    		<xsd:attribute name="Adresse" use="required">
    			<xsd:annotation>
    				<xsd:documentation>Nom et adresse du partenaire</xsd:documentation>
    			</xsd:annotation>
    			<xsd:simpleType>
    				<xsd:restriction base="xsd:string">
    					<xsd:minLength value="1"/>
    					<xsd:maxLength value="128"/>
    				</xsd:restriction>
    			</xsd:simpleType>
    		</xsd:attribute>
    	</xsd:attributeGroup>
    </xsd:schema>
    Fichier csrp-message-specv4.8.xsd :

    euh... si tu le veux vraiment dis le moi car il est 20 fois plus gros que le précédent!

    Merci de ton aide.

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Au temps pour moi, j'ai pédalé un peu dans la semoule...

    Cela dit, je confirme : le problème ne vient pas des W3C XML Schemas, PHP 5 ne les supporte pas. L'ajout des lignes suivantes n'est donc pas ce qui t'a permis de récupérer ton attribut (tu peux les retirer, ça ne changera rien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="E:\test_jeremy\integration\valid.xsd"
    Ce qui a "miraculeusement" réglé le problème est que tu as retiré du CSRP_ENVELOPPE du XML original cet attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns="urn:x-csrp:fr.csrp.protocole:enveloppe"
    Cet attribut signale que toutes les balises filles de la balise où est placé cet attribut, ainsi qu'elle-même appartiennent à cet espace de nom dit par défaut, ce dont il faut tenir compte dans ta requête XPath. Idem pour l'espace de nom de la balise MESSAGE_OFFICINE. Tous les espaces de nom que tu emploies dans ta requête XPath doivent être déclarés au préalable à l'aide de la méthode registerNamespace().
    Ca devrait donner le code PHP suivant (à utiliser avec le XML non modifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Je parcours le fichier 
    $xpath = new DOMXpath($dom); 
     
    // Je déclare les espaces de nom
    $xpath->registerNamespace('x', 'urn:x-csrp:fr.csrp.protocole:enveloppe');
    $xpath->registerNamespace('y', 'urn:x-csrp:fr.csrp.protocole:message');
     
    // Je définis mon chemin, en utilisant les préfixes x et y pour désigner les espaces de nom auquel chaque balise appartient 
    $res_req= $xpath->query('/x:CSRP_ENVELOPPE/x:CORPS/y:MESSAGE_OFFICINE/y:ENTETE/y:EMETTEUR'); 
     
    // Je récupère l'attribut 
    $Id_Client =$res_req->item(0)->getAttribute('Id_Client');
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Ah pauvre cilv1, il reprend mon projet....
    Si seulement tu n'était pas obligé de passer par PHP.
    Sur ce bon courage, j'espère que la partoe de création de réponse fonctionne bien elle.

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 41
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup pour ton aide et tes explications!

    J'ai essayé et en effet tu avais raison : c'est bien en déclarant les espaces de noms à l'aide de la méthode registerNamespace() que j'ai pu récupérer les informations nécessaires à mon projet.

    Par contre je n'ai pas l'impression que mon fichier soit réellement validé par les schémas XSD, mais je peux me tromper : un petit test après modification du nom d'une balise ne me retourne aucune erreur!

    Enfin bon normalement je n'ai pas besoin de valider le fichier que je reçois mais c'est toujours mieux de contrôler l'information...

    ps : je viens de voir ton post cuber, merci pour avoir entamé la discussion avec GrandFather grand maître du XML ! Cela m'a été d'une grande aide... bon courage pour la suite!

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/06/2012, 17h55
  2. Réponses: 3
    Dernier message: 10/10/2008, 18h43
  3. [JDOM] Validation avec un schéma XML
    Par tet.dum dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 22/11/2006, 22h37
  4. [Xml/Xsd]valider son fichier Xml avec un schéma xsd
    Par ePoX dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/02/2006, 22h30
  5. [XSD] Comparer deux schémas XSD
    Par solenn29 dans le forum Valider
    Réponses: 4
    Dernier message: 06/02/2006, 09h31

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