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

Format d'échange (XML, JSON...) Java Discussion :

Récupérer l'élément obligatoire manquante lors de la validation


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 33
    Points
    33
    Par défaut Récupérer l'élément obligatoire manquante lors de la validation
    J'ai un soucis et je vous demande vos lanternes, car moi je coule.
    Voici une partie simplifier de mon 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
     
    <xsd:complexType name="PersonName" abstract="true">
    	<xsd:sequence>
    		<xsd:element ref="domain:Forename" minOccurs="1" maxOccurs="unbounded"/>
    		<xsd:element ref="domain:Surname" minOccurs="1" maxOccurs="unbounded"/>
    		<xsd:element ref="domain:SecondSurname" minOccurs="0" maxOccurs="unbounded"/>
    	</xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="MessagePerson">
    	<xsd:sequence>
    		<xsd:element name="PersonName" minOccurs="1"/>
    		<xsd:element name="PersonSex"/>
    		<xsd:element name="PersonBirthDate"/>
    	</xsd:sequence>
    </xsd:complexType>
    Et voici mon code de validation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Message message = ... // JAXB object
    Validator validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).
    	newSchema(baseXsdLocation.getURL())
    	.newValidator();
    validator.setErrorHandler(new MessageValidationEventHandler());
     
    JAXBContext jc = JAXBContext.newInstance(contextPath);
    SAXResult result = new SAXResult(new MessageValidatingContentHandler());
    validator.validate(message, result);

    L'idée est de 1. valider mon objet JAXB via le validateur (ok cela fonctionne très bien), mais de 2. te capturer (et le mettre dans une liste par exemple) tout éléments erronés et naturellement aussi les éléments obligatoire.
    Pour cela j'ai mis un ErrorHandler qui permet de récupérer les exceptions et un ContentHandler qui permet de savoir sur quel éléments on se trouve. Pour les éléments invalide (c-a-d les éléments existant mais dont le contenu ne sont pas bon) cela fonctionne bien. Mais pour les éléments obligatoire j'obtiens ceci en log.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ContentHandler#startElement(localName : MessagePerson)
    MessageValidatingContentHandler#error(cvc-complex-type.2.4.a: Invalid content was found starting with element 'ns4:PersonSex'. One of '{"http://toto.eu/fubar/xsdFile":PersonName}'
    Le soucis c'est que je n'arrive pas à récupérer l'élément PersonName comme étant fautif (car on est sur MessagePerson et que le PersonName est null).
    Le moyen "facile" de récupérer l’élément manquant c'est de la manipulation de String du message d'exception... et cela je veux l'éviter
    L'autre moyen c'est de commencer à utiliser de l'XPATH dans du XSD et de déterminer quel est le prochain élément obligatoire par rapport à l'élément (child ou sibling) que j'ai obtenu via le ContentHandler. Mais là j'ai déjà mal à la tête. (Car le XSD c’est un cauchemar d’abstraction et de restriction et en plus sur plusieurs fichiers XSD)

    Si vous avez une belle idée à proposer je suis ouvert à toute suggestion.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 33
    Points
    33
    Par défaut
    Bon après discussion entre nous, on a décidé de laisser tomber cette façon de faire... C'est dommage mais bon on doit d'avancer.

    Mais par curiosité, si quelqu'un a une idee cela serait sympa sinon tant pis.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    J'ai des doutes sur la faisabilité de la chose... Mais en même temps, à moins de faire son propre éditeur XML (auquel cas il va falloir faire votre propre parseur,) je vois pas bien l'utilité de la chose.
    Quand on veut savoir ce qui valide pas, on ouvre le doc dans un éditeur XML. C'est pas compliqué c'est du texte, ça se transmet sans problème de 1000 façons différentes.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par thelvin Voir le message
    J'ai des doutes sur la faisabilité de la chose... Mais en même temps, à moins de faire son propre éditeur XML (auquel cas il va falloir faire votre propre parseur,) je vois pas bien l'utilité de la chose.
    Quand on veut savoir ce qui valide pas, on ouvre le doc dans un éditeur XML. C'est pas compliqué c'est du texte, ça se transmet sans problème de 1000 façons différentes.
    Dans notre cas c'est l'application qui généré le XML et avant de généré le XML on doit de valider les données entrer par l'utilisateur.

    L'idee vient a cause des méchants clients . Non plus sérieusement, c’était pour éviter de mettre en place des logiques de validation complexes (car la structure de données sont assez complexe) et d'utiliser la validation via JAXB. Malheureusement, le méchant client ne veut pas avoir un simple message d'erreur (se qui nous aurait bien arranger) mais savoir quelles sont toutes les erreurs de la structure.
    Comme cela ne fonctionne pas nous sommes obliger de mettre cette logique en place, donc la maintenir. Alors qu'au départ on pensait que le XSD via JAXB le fassent pour nous.

    Mais comme dit c'est pas grave, on va pas en mourir.

    En tout cas merci pour ta réponse cela conforte notre décision.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Je peux pas jurer que ce soit impossible, juste pas intéressant.

    À moins que je passe à côté de quelque chose, une bonne conception objet des parseurs XML devraient rendre ce genre d'utilisations possibles. Mais mes recherches n'ont pas donné grand-chose.

Discussions similaires

  1. [WD-2007] Éléments manquant lors de l'impression
    Par kimo3010 dans le forum Word
    Réponses: 3
    Dernier message: 22/02/2013, 12h45
  2. [Flex4] Récupérer l'élément d'un FXG lors d'un click
    Par titou624 dans le forum Flex
    Réponses: 0
    Dernier message: 28/10/2010, 12h01
  3. Réponses: 5
    Dernier message: 22/02/2006, 17h32
  4. Comment récupérer les éléments d'un autre programme ?
    Par Henri_13 dans le forum API, COM et SDKs
    Réponses: 22
    Dernier message: 29/11/2005, 00h16
  5. récupérer l' IP du client lors d'utilisation de sockets
    Par zegota dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 27/07/2005, 22h27

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