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 :

Permettre à un Element de recevoir du CDATA à la place de son contenu habituel


Sujet :

Valider XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    kij
    kij est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Par défaut Permettre à un Element de recevoir du CDATA à la place de son contenu habituel
    Bonjour,

    J'ai un petit souci sur un programme de validation XML via DTD/XSD.

    En effet, lorsque je valide un fichier XML avec et que des erreurs sont détectées, le programme ajoute des sections CDATA à l'intérieur des tags où il y a eu la ou les erreurs.

    Exemple:
    S'il y a une erreur à l'intérieur d'un tag nommé "description", le programme va donc écrire ceci en sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <description attr1="exemple">
    <![CDATA[
    <element id="1">
    <id>exempleId</id>
    </element>
    <element id="2">
    ...
    </element>
    ]]>
    </description>
    Une fois le fichier XML écrit en sortie, le programme se relance en quelque sorte lui-même pour valider à nouveau ce qu'il a écrit lui-même.

    C'est là que ça coince, la validation se faisant via XSD, le XSD n'est pas suffisamment permissif pour accepter le fait qu'il y ai une section CDATA à l'intérieur des tags <description>

    Lors de la seconde validation j'obtiens donc une autre erreur de validation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Element 'description' cannot have character [children], because the type's content type is element-only
    La définition de l'élément (complexType) 'description' est similaire à la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsd:complexType name="descriptionType">
        <xsd:sequence>
        ...
        </xsd:sequence>
        <xsd:attribute name="id" ... />
        <xsd:attribute ... />
    </xsd:complexType>
    Ma question est donc: que faut-il ajouter au niveau du XSD afin qu'il autorise la présence de section CDATA dans certains éléments ?

    En vous remerciant pour avance pour toute aide apportée.

    Cdlt.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Une section CDATA n'est rien d'autre qu'un machin qui dit "Je ne suis que du texte, pas une balise. Quand tu vois un < ce n'est pas l'ouverture d'une balise, c'est un signe 'inférieur à'."

    Autrement dit, c'est exactement comme si ton programme avait remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <description attr1="exemple">
    Tralalalà ! Le fric, c'est chic !
    </description>
    Rien que du texte.

    Pour que XSD accepte ça il suffit de mettre mixed="true", ou tout autre solution pour qu'il accepte du texte.

    Note : bien sûr, ce programme qui s'amuse à remplacer des balises par du texte au moyen d'un CDATA, fait n'importe quoi. Ça n'a pas de sens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    kij
    kij est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Par défaut
    Bonjour Thelvin,

    Déjà merci pour ton explication, et désolé pour le laps de temps sans réponses, j'ai du travailler sur un truc qui n'a rien avoir entre temps et ça m'est sorti de la tête.

    Je comprends et suis tout à fait d'accord qu'une mise sous CDATA pour des raisons de non validité XML soit une manière tout à fait incorrecte de faire.
    Mais pour des raisons que je ne peux malheureusement pas expliquer ici, ce choix est tout à fait justifié. (et de toute façon je n'ai pas le choix, le client est roi comme on dit...)

    Donc si je comprend bien, je n'ai qu'à ajouter un mixed="true" au niveau de la définition de "description" par exemple ?
    Ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsd:complexType name="descriptionType" mixed="true">
        <xsd:sequence>
        ...
        </xsd:sequence>
        <xsd:attribute name="id" ... />
        <xsd:attribute ... />
    </xsd:complexType>
    Si c'est le cas j'ai une autre question, un point que j'ai soulevé sur cette manière d'autoriser du CDATA, c'est qu'avec cette nouvelle définition XSD, si jamais j'ai des caractères à l'intérieur d'un tag <description>, mon process de validation ne sera plus capable de le détecter en tant qu'erreur, ais-je raison / tord de penser ça ?

    Dans tous les cas je te remercie pour ta réponse.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par kij Voir le message
    Donc si je comprend bien, je n'ai qu'à ajouter un mixed="true" au niveau de la définition de "description" par exemple ?
    Ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsd:complexType name="descriptionType" mixed="true">
        <xsd:sequence>
        ...
        </xsd:sequence>
        <xsd:attribute name="id" ... />
        <xsd:attribute ... />
    </xsd:complexType>
    Oui, mais tu vas peut-être devoir rendre la séquence optionnelle, puisque dans ton exemple, il n'y a plus d'élément dans <description>. Après ça te regarde, elle l'était peut-être déjà.

    Citation Envoyé par kij Voir le message
    Si c'est le cas j'ai une autre question, un point que j'ai soulevé sur cette manière d'autoriser du CDATA, c'est qu'avec cette nouvelle définition XSD, si jamais j'ai des caractères à l'intérieur d'un tag <description>, mon process de validation ne sera plus capable de le détecter en tant qu'erreur, ais-je raison / tord de penser ça ?
    Tu as tout-à-fait raison : c'est normal puisque depuis que c'est entouré d'un CDATA, il y a justement des caractères à l'intérieur du tag <description>, et que c'est justement ça que tu cherches à faire accepter.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    kij
    kij est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Par défaut
    Oui tu as raison, je vais devoir rendre la séquence optionnelle, chose qui ne l'est pas actuellement.

    Mais il m'apparait désormais que le choix du client n'est clairement pas possible. On ne peut pas se permettre d'autoriser les caractères puisque ce serait rendre la validation totalement inutile.
    De ce fait il ne sera pas possible d'échanger la donnée entre CDATA. Je vais devoir faire le point avec les principaux intéressés.

    Je te remercie pour tout.

    ++

Discussions similaires

  1. unexpected element cdata soapUI
    Par enzostar dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 30/07/2012, 14h01
  2. [Prototype] element.update ne marche pas avec IE6 si le contenu contient <li>
    Par ilalaina dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 23/10/2009, 08h48
  3. Réponses: 4
    Dernier message: 27/04/2007, 21h54
  4. [XSLT]position d'un element de valeur specifique
    Par squat dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/07/2002, 16h42
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

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