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 :

[RELAX NG] [Emacs, mode nXML] Correspondance entre les grammaires XML Schema et Relax NG (surtout les es [XSD]


Sujet :

Valider XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 9
    Points
    9
    Par défaut [RELAX NG] [Emacs, mode nXML] Correspondance entre les grammaires XML Schema et Relax NG (surtout les es
    Bonjour à tous.

    Voila, je suis un utilisateur intensif d'Emacs et je dois me mettre au langage XML. Pour cette dernière raison, j'ai acheté, sur conseil de ce site, le livre "Petit manuel de prise en main de XML". Il est parfait pour débuter.

    Pour en revenir à Emacs, le mode majeur, maintenant par défaut, du langage XML est nXML. Il fonctionne à merveille. Mais il a l'inconvénient (ou peut être l'avantage?) d'utiliser les schémas Relax NG compact.

    J'ai donc du me mettre également à ce langage qui me semble extrêmement puissant. En effet, par rapport aux schémas du W3 on réduit par trois ou quatre le volume du fichier.

    Outre le fait qu'il faut que j'apprenne un langage supplémentaire, et je ne parle pas de la version non compact de Relax NG, j'ai pas mal de difficultés pour convertir les schémas type W3 (.xsd) en Relax NG compact.

    Il y a bien trang, qui permet des conversions automatiques, mais il lui manque le passage de XML Schema en relax NG dans ses deux formes.

    Néanmoins, il existe un fichier XSLT, qui comble cette lacune. Il s'agit de XSDtoRNG.xsl. Il semble fonctionner correctement hormis le fait qu'il ne gère pas les éléments avec un attribut mixed="true". Une petite rectification, à la main et à posteriori directement dans le ficher ".rng", règle le problème.

    Je vais prendre un exemple concret à partir du livre déjà cité.

    Le point de départ est le schéma W3 :
    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
     
    <?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns="http://www.kehogo.com/ns/mdm/1.0" 
        targetNamespace="http://www.kehogo.com/ns/mdm/1.0" 
        elementFormDefault="qualified">
     
        <xs:element name="anciennes_merveilles">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="merveille" type="typeMerveille" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
     
        <xs:complexType name="typeMerveille">
            <xs:sequence>
                <xs:element name="nom" type="typeNom" maxOccurs="unbounded"/>
                <xs:element name="lieu" type="xs:string"/>
                <xs:element name="hauteur" type="typeHauteur"/>
                <xs:element name="historique" type="typeHistorique"/>
                <xs:element name="image_principale" type="typeImage" form="unqualified"/>
                <xs:element name="source" type="typeSource" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
     
        <xs:complexType name="typeNom">
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="langue" type="xs:string" use="required"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
     
        <xs:complexType name="typeHauteur">
            <xs:simpleContent>
                <xs:extension base="xs:nonNegativeInteger">
                    <xs:attribute name="unité" type="xs:string" use="required"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
     
        <xs:complexType name="typeHistorique">
            <xs:sequence>
                <xs:element name="année_construction" type="typeAnnée"/>
                <xs:element name="année_destruction" type="typeAnnée" minOccurs="0"/>
                <xs:element name="motif_destruction" type="typeDestr" minOccurs="0"/>
                <xs:element name="histoire" type="typeHistoire"/>
            </xs:sequence>
        </xs:complexType>
     
        <xs:complexType name="typeAnnée">
            <xs:simpleContent>
                <xs:extension base="xs:positiveInteger">
                    <xs:attribute name="ère" type="xs:string" use="required"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
     
        <xs:simpleType name="typeDestr">
            <xs:restriction base="xs:string">
                <xs:enumeration value="tremblement de terre"/>
                <xs:enumeration value="incendie"/>
            </xs:restriction>
        </xs:simpleType>
     
        <xs:complexType name="typeHistoire" mixed="true">
            <xs:sequence>
                <xs:element name="para" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType/>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
     
        <xs:complexType name="typeImage">
            <xs:attribute name="fichier" type="xs:anyURI" use="required"/>
            <xs:attribute name="l" type="xs:positiveInteger" use="required"/>
            <xs:attribute name="h" type="xs:positiveInteger" use="required"/>
        </xs:complexType>
     
        <xs:complexType name="typeSource">
            <xs:attribute name="idsection" type="xs:positiveInteger" use="required"/>
            <xs:attribute name="idjournal" type="xs:positiveInteger" use="required"/>
        </xs:complexType>
     
    </xs:schema>
    Et le document à valider est :
    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
     
    <?xml version="1.0"?>
    <!-- Note : Les experts ne sont pas d'accord sur les dates précises ou les
        dimensions de la plupart des merveilles. Dans ce cas, j'ai choisi une année
        ou une   dimension médiane afin que tous les attributs soient numériques. -->
     
    <mdm:anciennes_merveilles xmlns:mdm="http://www.kehogo.com/ns/mdm/1.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd">
     
        <!-- Cet exemple ne contient qu'une seule merveille. -->
        <mdm:merveille>
            <mdm:nom langue="Français">Le colosse de Rhodes</mdm:nom>
            <mdm:nom langue="Grec">Κολοσσός της Ρόδου</mdm:nom>
            <mdm:lieu>Rhodes en Grèce</mdm:lieu>
            <mdm:hauteur unité="mètres">32</mdm:hauteur>
            <mdm:historique>
                <mdm:année_construction ère="BC">282</mdm:année_construction>
                <mdm:année_destruction ère="BC">226</mdm:année_destruction>
                <mdm:motif_destruction>tremblement de terre</mdm:motif_destruction>
                <mdm:histoire>
                    En 294 avant J.C., les habitants de l'île de Rhodes ont commencé la
                    construction d'une gigantesque statue de Hélios, le dieu du soleil. Ils
                    pensaient en effet que c'était grâce à lui qu'ils avaient pu soutenir un
                    long siège de l'île et en ressortir vainqueurs.<mdm:para/>Le colosse
                    était construit en bronze renforcé de fer et alourdi par des pierres.
                    Bien qu'il soit souvent représenté comme  enjambant le port de
                    Mandrákion, nous savons aujourd'hui que c'est techniquement impossible et
                    qu'il devait donc probablement être situé à côté de ce port.<mdm:para/>La
                    statue s'effondra à la suite d'un tremblement de terre en 226 avant J.C.
                    Elle se brisa au niveau des genoux et se coucha au sol. L'oracle de
                    Delphes annonça qu'elle était tombée parce que le peuple de Rhodes avait
                    offensé Hélios et ils décidèrent donc de ne pas la reconstruire.<mdm:para/>La
                    statue resta au sol jusqu'en 654 après J.C. Même brisée, elle était si
                    impressionnante que beaucoup faisaient le voyage pour la contempler.       
                </mdm:histoire>
            </mdm:historique>
            <image_principale fichier="colossus.jpg" l="528" h="349"/>
            <mdm:source idsection="101" idjournal="21"/>
        </mdm:merveille>
    </mdm:anciennes_merveilles>
    Je convertis le schéma type W3 en Relax NG non-compact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        :-)  $ xsltproc -o 13-07.rng ./XSDtoRNG.xsl 13-07.xsd
    Là, je tente conversion Relax NG non-compact en Relax NG compact :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     :-)  $ trang -I rng -O rnc 13-07.rng 13-07.rnc 
    ~/tmp/essai_relax/livre_ch_13/tmp/13-07-06/13-07.rng:67:27: error: missing children
     :-)  $
    L'erreur provient du fait que typeHistoire a un attribut mixed="true".
    Je corrige à la main le fichier rng comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	<rng:define	name="typeHistoire">
            <rng:zeroOrMore>
    	<rng:text/>
    	<rng:element	name="para">
    	<rng:text/>
    	</rng:element>
    	<rng:text/>
    	</rng:zeroOrMore>
    	</rng:define>
    Et là, je peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        :-)  $ trang -I rng -O rnc 13-07.rng 13-07.rnc 
        :-)  $
    Plus de message d'erreur.

    Je suis donc maintenant l'heureux possesseur d'un schéma NG compact fonctionnel. En fait, pas vraiment, car lorsque je charge le fichier XML exemple du livre, Emacs me stipule qu'il n'est pas valide. En réalité, il l'est effectivement puisque c'est l'exemple du livre et donc, il doit y avoir un problème dans le schéma.

    Tout d'abord, je règle les erreurs les plus faciles à résoudre : Beaucoup de données ne sont pas au bon format d'après le schéma. Pas exemple, la donnée "nom". J'ajoute donc dans mon schéma, xsd:string au typeNom. Même principe pour typeHauteur et typeAnnée avec un entier positif.

    Le code définitif est donc :
    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
     
    default namespace = "http://www.kehogo.com/ns/mdm/1.0"
    namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
    namespace rng = "http://relaxng.org/ns/structure/1.0"
     
    start = anciennes_merveilles
    anciennes_merveilles =
      element anciennes_merveilles {
        element merveille { typeMerveille }+
      }
    typeMerveille =
      element nom { typeNom }+,
      element lieu { xsd:string },
      element hauteur { typeHauteur },
      element historique { typeHistorique },
      element image_principale { typeImage },
      element source { typeSource }*
    typeNom = attribute langue { xsd:string },
       xsd:string
    typeHauteur = attribute unité { xsd:string },
       xsd:positiveInteger
    typeHistorique =
      element année_construction { typeAnnée },
      element année_destruction { typeAnnée }?,
      element motif_destruction { typeDestr }?,
      element histoire { typeHistoire }
    typeAnnée = attribute ère { xsd:string },
       xsd:positiveInteger
    typeDestr = "tremblement de terre" | "incendie"
    typeHistoire =
      (text,
       element para { text },
       text)*
    typeImage =
      attribute fichier { xsd:anyURI },
      attribute l { xsd:positiveInteger },
      attribute h { xsd:positiveInteger }
    typeSource =
      attribute idsection { xsd:positiveInteger },
      attribute idjournal { xsd:positiveInteger }
    On peut constater que ce langage mérite bien sont adjectif de "compact"!

    Maintenant, il me reste deux erreurs irréductibles.
    A)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd"
    Avec le message :
    Attribute not allowed.
    B)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	        <image_principale fichier="colossus.jpg" l="528" h="349"/>
    Avec le message :
    Missing xmlns="http://www.kehogo.com/ns/mdm/1.0"

    J'ai cherché sur internet une solution à mon problème, mais il semblerait que relax NG ne soit pas beaucoup utilisé. Il y a donc peut d'écrits sur ce sujet.

    Quelqu'un peut-il m'éclairer sur les correspondances entre les XML Schemas et les schémas Relax NG? Tout particulièrement au sujet des espaces de noms et de leurs attributs, c'est là que je bute comme le montre l'exemple.

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Citation Envoyé par Valrik Voir le message
    Missing xmlns="http://www.kehogo.com/ns/mdm/1.0"
    Puique image_principale ne vit pas dans cette espace, c'est evidemment de l'impliquer de cela avec l'espace de nom default.

    Il faut prendre ces mesures.
    [1] Ajouter une espace null dans la partie de déclarations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    namespace local=""
    [2] Et puis, la ligne d'image_principale doit être ecrite comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      element local:image_principale { typeImage },

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Impeccable! tsuji. :-)
    J'ai compris mon erreur et maintenant je n'ai plus d'erreur sur cette ligne.

    Reste l'erreur sur xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd" avec xsi:schemaLocation qui passe au rouge.

    Il y a bien une solution un peu barbare...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <mdm:anciennes_merveilles xmlns:mdm="http://www.kehogo.com/ns/mdm/1.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- 
        xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd">
    -->
    Ainsi, la barre d'état passe à "Valid", mais ce n'est pas très élégant de procéder ainsi!

    J'aimerais avoir à ne pas modifier le fichier xml en fonction du type de schéma.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Reste l'erreur sur xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd" avec xsi:schemaLocation qui passe au rouge.
    Tous les processeurs de wxsl doivent supporter tacitement l'espace de nom XMLSchema-instance. Mais cela n'a evidemment pas de sens pour un processeur de relaxng. Si vous voulez les laisser passer, vous pouvez faire comme cela.

    [3] Déclarer un préfix comme xsi dans la section propre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    namespace xsi="http://www.w3.org/2001/XMLSchema-instance"
    [4) Et puis, ajouter ceci dans la racine du document.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    anciennes_merveilles =
      element anciennes_merveilles {
        (attribute xsi:schemaLocation {list {xsd:anyURI+}} 
        |attribute xsi:noNamespaceSchemaLocation {xsd:anyURI}
        )?,
        element merveille { typeMerveille }+
      }
    Les types de ces attributs ne sont peut-être pas les meilleurs - je n'y ai pas pensé trop, mais ça peut travailler déjà raisonnablement bien.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Et bien, ma foi, tout cela me paraît raisonnablement parfait. Ça fonctionne super! Plus aucune erreur.

    En fait, si je comprends bien, il faut traiter l'élément racine comme un élément ordinaire qui posséderait des attributs dont les valeurs sont des espaces de noms.

    Un grand merci pour ton aide précieuse. ;-)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Oups! Je viens de m'apercevoir que j'avais fait un erreur.

    En effet, j'avais oublié de coller namespace xsi="http://www.w3.org/2001/XMLSchema-instance" après la kyrielle de "namespaces". Et lorsque j'ai rectifié le code, je me suis retrouvé dans le même cas de figure qu'au début.

    Voila le code qui provoque une erreur :
    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
     
    default namespace = "http://www.kehogo.com/ns/mdm/1.0"
    namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
    namespace rng = "http://relaxng.org/ns/structure/1.0"
    namespace xsi="http://www.w3.org/2001/XMLSchema-instance"
    namespace local = ""
     
    start = anciennes_merveilles
    anciennes_merveilles =
       (attribute xsi:schemaLocation {list {xsd:anyURI+}} 
        |attribute xsi:noNamespaceSchemaLocation {xsd:anyURI}
       )?,
       element anciennes_merveilles {
          element merveille { typeMerveille }+
       }
    typeMerveille =
       element nom { typeNom }+,
       element lieu { ...
    Et voici l'emplacement de l'erreur détectée dans le fichier xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0"?>
    <!-- Note : Les experts ne sont pas d'accord sur les dates précises ou les
        dimensions de la plupart des merveilles. Dans ce cas, j'ai choisi une année
        ou une   dimension médiane afin que tous les attributs soient numériques. -->
     
    <mdm:anciennes_merveilles xmlns:mdm="http://www.kehogo.com/ns/mdm/1.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd">
        __________________
               |
               |_____ En erreur! (Attribute not allowed)

  7. #7
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je ne peux pas confirmer mais ça n'engage que moi.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Que veux tu dire par là? Qu'il y a une incohérence entre ton application et Emacs?

    En tout cas, puisque l'attribut xsi:schemaLocation n'a pas de signification particulière, je serais pour ne pas déclarer le namespace. Après tout, cela fonctionne fort bien sans. Qu'en penses-tu?

    J'ai l'impression que si cet espace de noms n'est pas déclaré, l'argument est traité comme une vulgaire chaîne de caractères dont le contenu est "xsi:schemaLocation". Et ainsi, le code xml correspond bien au schéma.

  9. #9
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    C'est fort bien si tu es content que l'attribut schemaLocation ne soit pas là par quelque moyen que ce soit. Mais je veux dire qu'il soit toléré par l'addition que j'ai mise là dans le rnc. Je n'ai rien à dire de plus en Emac, peut-être pour un jour ultérier, je ne sais pas.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    OK, et merci encore pour ton aide.


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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/11/2011, 04h15
  2. correspondance entre 1 fichier xml et un autre
    Par mflat2 dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 25/06/2010, 11h02
  3. correspondance entre nombre et les mois
    Par minooo dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 29/03/2010, 13h59
  4. Réponses: 2
    Dernier message: 02/12/2006, 21h58

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