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 :

[XML] gestion des string vide?


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Par défaut [XML] gestion des string vide?
    bonjour,

    donc voilà, j'ai un bout de code de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    writer.WriteStartElement("Description");
    writer.WriteString(this.description);
    writer.WriteEndElement();
    Le problème est que quand ma chaine this.description est vide, il me met :

    Alors que j'attend :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Description></Description>
    Quelqu'un a déjà eu ce problème?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ce qu'il affiche est parfaitement correct du point de vue de la syntaxe XML. Un élément qui ne contient rien peut être représenté par une seule balise avec le "/" à la fin, il n'y a pas besoin d'avoir une balise ouvrante et une fermante.
    Après, il y a peut-être une option pour contrôler ça plus finement et forcer l'affichage des 2 balises, il faudrait chercher dans la doc du XmlWriter...

    EDIT: sinon tu peux toujours vérifier si la chaine est vide, et si c'est le cas, tu écris les tags manuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (this.description != null && this.description.Length > 0)
    {
        writer.WriteStartElement("Description");
        writer.WriteString(this.description);
        writer.WriteEndElement();
    }
    else
    {
        writer.WriteRaw("<Description></Description>");
    }
    Mais bon, je vois pas trop l'intérêt, vu que "<Description />" est parfaitement correct...

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Il me semble qu'il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.WriteFullEndElement();
    pour obtenir ce comportement.

  4. #4
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ce qu'il affiche est parfaitement correct du point de vue de la syntaxe XML. Un élément qui ne contient rien peut être représenté par une seule balise avec le "/" à la fin, il n'y a pas besoin d'avoir une balise ouvrante et une fermante.
    Après, il y a peut-être une option pour contrôler ça plus finement et forcer l'affichage des 2 balises, il faudrait chercher dans la doc du XmlWriter...

    EDIT: sinon tu peux toujours vérifier si la chaine est vide, et si c'est le cas, tu écris les tags manuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (this.description != null && this.description.Length > 0)
    {
        writer.WriteStartElement("Description");
        writer.WriteString(this.description);
        writer.WriteEndElement();
    }
    else
    {
        writer.WriteRaw("<Description></Description>");
    }
    Mais bon, je vois pas trop l'intérêt, vu que "<Description />" est parfaitement correct...


    Le problème est quand je lis mon champ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "DEntry.Description" && suite)
                        reader.Read();
                    else suite = false;
                    if (reader.NodeType == XmlNodeType.Text && suite)
                    { description = reader.Value; reader.Read(); }
                    else suite = false;
                    if (reader.NodeType != XmlNodeType.EndElement && suite)
                        suite = false;
    J'utilise un code de ce type pour controler le contenu de mon champ, au cas où j'aurais un fichier xml erroné comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <Description>
       <Detail>
       ....
       </Detail>
    </Description>
    Je fais peut etre une erreur dans ma façon de controler l'integrité de mon fichier XML.....
    En tout cas, avec ce code, quand j'ai une balise <Description />, il considère que ma balise n'est pas conforme à ce qui est attendu.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    ben je sais pas trop, je fais jamais de parsing XML manuel, j'utilise plutôt la sérialisation XML...

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Pour contrôler l'intégrité d'un fichier xml ne faut il pas utiliser un XSD ou un DTD ?

    Je ne suis pas sur car je ne suis pas à jour sur les évolutions du xml.
    Je me souviens juste qu'une DTD permet de vérifier l'intégrité d'un fichier XML lorsqu'on le parse.
    Normalement si tu précise dans ton XML que tu utilises telle dtd ou telle xsd, localisé à telle endroit, le parseur fournis avec le framework (XMLDocument ou XPATHDocument) vérifie que le Xml est conforme.

  7. #7
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Par défaut
    pour l'integrité, je vais voir les dtd, sinon j'ai réussi à relire quand j'ai du : <Description />

    au lieu de lire un debut, un string et une fin, il lit seulement le debut et la fin.

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par bakonu Voir le message
    sinon j'ai réussi à relire quand j'ai du : <Description />

    au lieu de lire un debut, un string et une fin, il lit seulement le debut et la fin.
    Pourrais-tu nous en dire un peu plus (avec quelques lignes de codes), je n'ai pas compris ce que tu racontes et j'ai déjà rencontré le problème moi-meme, donc la solution m'intéresse.
    Merci !

  9. #9
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    A priori, ce que tu souhaites au final c'est pouvoir vérifier que ton fichier XML est bien formé. A ce moment, l'utilisation d'un fichier XSD pour effectuer la vérification serait le plus simple, tant que la structure du fichier XML n'est pas trop compliquée évidemment :p

    En gros, DTD = vérification de la forme et XSD = vérification de la forme et du fond.

    Donc si en plus de valider la structure, tu veux pouvoir valider le contenu (tel balise/atribut n'accepte que des chaînes avec une longueur maximale de 10 caractères, ou que du numérique, ou une liste de valeurs prédéfinies, ...), un XSD est plus approprié.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    juste histoire d'apporter ma pierre a l'édifice...

    au lieu d'écrire une horreur du genre :

    if (description != null && description.length > 0)

    utiliser :

    if (!String.IsNullOrEmpty(description))

    ca rend le code plus lisible, et pourquoi recoder systèmatiquement ce qui existe déjà ?
    comme le dit la signature de ced600 : pourquoi faire compliqué, quand on peut faire encore plus compliqué ?

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par cinemania Voir le message
    juste histoire d'apporter ma pierre a l'édifice...

    au lieu d'écrire une horreur du genre :

    if (description != null && description.length > 0)

    utiliser :

    if (!String.IsNullOrEmpty(description))

    ca rend le code plus lisible, et pourquoi recoder systèmatiquement ce qui existe déjà ?
    comme le dit la signature de ced600 : pourquoi faire compliqué, quand on peut faire encore plus compliqué ?
    Tiens, j'avais jamais remarqué cette fonction... c'est plus propre en effet !

  12. #12
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Pourrais-tu nous en dire un peu plus (avec quelques lignes de codes), je n'ai pas compris ce que tu racontes et j'ai déjà rencontré le problème moi-meme, donc la solution m'intéresse.
    Merci !
    Voici le code que j'utilise actuellement sans DTD ou autre système de contrôle, autre que le mien :

    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
     
    //description
                    if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "Description" && suite)
                        reader.Read();
                    else suite = false;
                    if (reader.NodeType == XmlNodeType.EndElement && suite)
                    {
                        description = "";
                    }
                    else
                    {
                        if (reader.NodeType == XmlNodeType.Text && suite)
                        { description = reader.Value; reader.Read(); }
                        else suite = false;
                        if (reader.NodeType != XmlNodeType.EndElement && suite)
                            suite = false;
                    }
    en fait quand j'ai le code suivant de vrai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    reader.NodeType == XmlNodeType.Element && reader.LocalName == "Description"
    si j'ai une balise <Description />, j'aurais après le prochain Read(); :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    reader.NodeType == XmlNodeType.EndElement
    qui sera égale à vrai.

    sinon avec <Description>....</Description>, j'aurais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    reader.NodeType == XmlNodeType.Text
    qui sera vrai.

Discussions similaires

  1. gestion des champs vides
    Par nizzart dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/04/2008, 14h49
  2. Gestion des PDF vide
    Par lucyole dans le forum iReport
    Réponses: 1
    Dernier message: 26/03/2008, 10h50
  3. gestion des champs vides
    Par momo-e dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/09/2007, 16h25
  4. Gestion des lignes vides avant/après une liste
    Par Invité dans le forum Mise en forme
    Réponses: 4
    Dernier message: 28/08/2007, 16h25
  5. Quel parseur XML pour des Strings ?
    Par krokmitaine dans le forum XML
    Réponses: 13
    Dernier message: 19/12/2006, 21h01

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