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

C# Discussion :

Parser un élément facultatif avec DOM


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut Parser un élément facultatif avec DOM
    Bonjour,

    Je développe actuellement une application, utilisant un parser DOM avec un schéma XML et plusieurs fichiers d'instance XML.

    Dans mon schéma, il y a certains éléments qui sont facultatifs, c'est à dire avec minOccurs = 0.

    Mon problème est le suivant:

    Lorsque que j'essai de récupérer un élément facultatif (qui a un noeud parent obligatoirement) j'ai une exception qui se lance (normal étant donné qu'il ne trouve pas l'élément à chaque fois).

    Y a t'il un moyen d'éviter de faire un if pour vérifier si le noeud récupéré est null et d'éviter un try catch, j'ai environs une 30ène d'éléments facultatifs, j'aimerais éviter de faire ça pour chaque élement, n'y a t'il pas un moyen de vérifier au près du schéma et ainsi d'éviter de lancer l'exception ?

    Merci d'avancer pour vos réponses.

    Birssan

  2. #2
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    bonjour

    A ma connaissance, il faut faire les testes pour chaque.
    Un extrait de code aiderait pour répondre.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    Voici une un élément dans le schéma en facultatif avec son noeud parent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xs:element name="Trait" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:all>
                        <xs:element name="Key" type="xs:nonNegativeInteger"/>
                        <xs:element name="Name" type="xs:string"/>
                        <xs:element name="Icon" type="xs:string"/>
                        <xs:element name="PrereqTraitKey" minOccurs="0" type="xs:nonNegativeInteger"/>
    On voit ici le noeud trait qui à plusieurs ChildNodes, celui qui est facultatif est le noeud PrereqTraitKey.

    Voici le code correspondant du côté C#:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     XmlNodeList skills = mXDoc.GetElementsByTagName(XMLTags.TRAIT,XMLTags.NAMESPACE_URI);
                foreach (XmlNode node in skills)
                {
                    XmlNamespaceManager nspm = new XmlNamespaceManager(mXDoc.NameTable);
                    nspm.AddNamespace(XMLTags.PREFIX, XMLTags.NAMESPACE_URI);
                    int key, parent = -1, nbrequis, niveaumax, ligne, colonne,count;
                    int.TryParse(node.SelectSingleNode(node.Prefix + ":" + XMLTags.KEY,nspm).InnerText, out key);
                    string nom = node.SelectSingleNode(node.Prefix + ":" + XMLTags.NAME,nspm).InnerText;
                    string image = node.SelectSingleNode(node.Prefix + ":" + XMLTags.IMAGE,nspm).InnerText;
                    Console.WriteLine("Key: " + key + " / Parent: " + parent + " / Nom: " + nom + " / Image: " + image);
                    if(node.SelectSingleNode(node.Prefix + ":" + XMLTags.PARENT,nspm) != null)
                        int.TryParse(node.SelectSingleNode(node.Prefix + ":" + XMLTags.PARENT,nspm).InnerText, out parent);
    Je récupère tous les noeud Trait et je lis les ChildNode dans le foreach, pour le noeud facultatif il s'agit celui qui est dans la condition (XmlTags.Parent)

    j'espère que celà pourra vous aider un peu plus à comprendre mon problème

    Birssan

  4. #4
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Désolé, j'aurais fait la même chose...
    Il serait intéressant de savoir comment s'y prend XmlSerializer dans ce genre de cas.
    D'ailleur ne peux-tu pas utiliser les classes de sérialisation/désérialisation deu framework ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    Je ne suis pas un expert en DOM parser (que ce soit en C# ou autre) donc je ne connais pas ces classes, je vais me renseigner, merci pour l'information.

  6. #6
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    lis ce tuto
    Après tu peux avoir des raisons de le faire à la main... On est toujours confronté à des cas bizarres dans ce métier.

  7. #7
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    avec VS tu as un menu XML pour créer des schéma à partir d'un fichier (mais ce dernier doit contenir tous les cas possibles si tu ne veux pas t'embêter après - comme tout outils de génération auto).

    Par contre, je en sais aps si c'est dispo dans toutes les versions (ok pour pro et ultimate)

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    Et bien j'avais déjà mon schéma, j'ai trouvé l'outil xsd.exe qui me permet de générer mes classes de sérialisation à partir du schéma (très pratique).

    J'ai donc effectué la désérialisation mais je rencontre actuellement quelques problèmes (les classes générées utilisent des tableaux pour les noeuds), j'ai le début de mon fichier xml (les deux premiers attributs) mais ensuite mes tableaux sensés contenir des objets des classes générées sont vide, je sais pas pourquoi donc je cherche actuellement dans le code des classes générées pour voir ce qui ne va pas...

    EDIT: J'ai finalement trouvé la solution, dans la première classe générée (la classe qui correspond au noeud root) il y avait un tableau à deux dimension, il y avait une dimension en trop . Tout est réglé j'ai accès à chaque information de mon fichier. C'est bien plus rapide que d'utiliser DOM, merci encore pour votre aide

    EDIT2: En revanche chose assez embêtante, chaque élément ou attribut qui est en integer dans mon schéma se traduit en string lors de la génération automatique des classes

  9. #9
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Citation Envoyé par Birssan Voir le message
    EDIT2: En revanche chose assez embêtante, chaque élément ou attribut qui est en integer dans mon schéma se traduit en string lors de la génération automatique des classes
    oui, c'est embêtant... Je ne génère jamais mes classes à partir du xsd... mais j'imagine que tu dois pouvoir changer à la main les types. Je fais toujours le travail à partir des classes :
    Class -> XML -> XSD (corrigé à la mano).
    Mais dans certains cas, on nous fourni un XML et c'est à nous de faire la correspondance, donc la DOM ou génération auto... Quand je n'ai pas al main sur le xml, je préfère utiliser DOM... c'est peut-être bizarre.

    Enfin, ton problème étant courrant tu devrais trouver de la doc ou de l'aide assez facilement.

  10. #10
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    J'ai deux solutions, soit je change tout en int en mettant à -1 par exemple les attributs qui ne sont pas obligatoirement dans le xml, ou alors je laisse en string, si la valeur est null, je laisse sinon je converti en int (ou float) au moment de l'utilisation...

    Quoi qu'il en soit merci bien pour l'aide fournie, j'aurais appris une autre façon de parser

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

Discussions similaires

  1. Parser un fichier xsd avec dom
    Par shyrize dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 20/07/2009, 13h41
  2. [DOM4J] Parser un document XML avec DOM
    Par kroax dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 23/11/2007, 01h48
  3. Parser un fichier XML avec DOM
    Par Bayard dans le forum Général Python
    Réponses: 1
    Dernier message: 02/11/2007, 20h44
  4. parser un fichier xml avec dom
    Par cilies38 dans le forum Modules
    Réponses: 2
    Dernier message: 04/03/2007, 21h12
  5. [DOM] Insertion d'éléments avec DOM
    Par TheReturnOfMuton dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 27/06/2006, 15h33

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