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 :

XDocument: Erreur en recherchant un element/attribut


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Par défaut XDocument: Erreur en recherchant un element/attribut
    Bonjour a tous,

    Je suis en plein Linq to XML et franchement je galere. je viens de "resoudre" un probleme sans vraiment comprendre ce que j'ai pu faire

    Je dois traiter un fichier XML pour en ressortir des donnees. En voila un extrait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ConfigDataFile
     xmlns:un="blabla.xsd" 
     xmlns:xn="truc.xsd"
     xmlns:gn="machin.xsd" 
     xmlns="configData.xsd" 
     xmlns:es="Attributes">
        <fileHeader fileFormatVersion="2.0.1" Name="Dupont"/>
    		<configData dnPrefix="Undefined">
                     [...]
    	    </configData>
        <fileFooter dateTime="2011-11-28"/>
    </ConfigDataFile>
    Je charge les donnees XML en utilisant le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            public bool loadXMLDoc(string FileNameXML)
            {
                var doc = XDocument.Load(FileNameXML);
                xmldoc = doc;
                string fileVersion = "";
                fileVersion = xmldoc.Root.Element("fileHeader").Attribute("fileFormatVersion").Value;
                if (fileVersion == CONST_VERSION)
                    return true;
                return false;
            }
    Si j'execute le code ci-dessus avec le XML donne plus haut, j'ai droit a une belle erreur:
    System.NullReferenceException was unhandled
    Message=Object reference not set to an instance of an object.
    J'ai eu beau le retourner dans tout les sens pas moyen de trouver un bout de code qui marche ...

    Apres moult recherches (en creant de petits bouts de XML) j'en suis arrivee a modifier mon fichier XML originel de la maniere suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ConfigDataFile
     xmlns:un="blabla.xsd" 
     xmlns:xn="truc.xsd"
     xmlns:gn="machin.xsd" 
     xmlns:cd="configData.xsd" 
     xmlns:es="Attributes">
        <fileHeader fileFormatVersion="2.0.1" Name="Dupont"/>
    		<configData dnPrefix="Undefined">
                     [...]
    	    </configData>
        <fileFooter dateTime="2011-11-28"/>
    </ConfigDataFile>
    Pour ceux qui ne suivent pas la difference se trouve dans la ligne:
    xmlns:cd="configData.xsd", j'ai effectivement rajoute un "identifiant" (je ne connais pas la denomination) devant le namespace que je suppose etre celui par defaut.

    Si je passe ce nouveau fichier XML dans le meme code plus haut, pas d'erreur, le numero de version sort bien comme il le faut.

    Quelqu'un aurait-il une idee du pourquoi du comment ?

    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonjour,

    Ce n'est pas ma spécialité donc la terminologie est peut-être erronée (mais l'idée est là )

    Dans ton premier cas, ton élément fileHeader est en réalité configData.xsd::fileHeader (comprendre par là qu'il est qualifié du namespace par défaut = celui sans nom)
    Par conséquent lorsque tu recherches ton élément il n'est pas trouvé car ce n'est pas le même que tu recherches.

    Dans le second cas, plus de problème tous les namespaces sont nommés donc fileHeader correspond bien.

    tu devrais essayer de passer un XName à ta méthode Element quelque chose ressemblant à ceci fileVersion = xmldoc.Root.Element(XName.Get("fileHeader", XNamespace.Get("configData.xsd"))).Attribute("fileFormatVersion").Value;
    À adapter (et à voir si l'attribut le nécessite aussi).

    Cordialement !

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Par défaut
    Merci !

    C'etait tordu mais simple en fait ;-)

    Cela fonctionne avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fileVersion = xmldoc.Root.Element(XName.Get("fileHeader","configData.xsd")).Attribute("fileFormatVersion").Value;
    Je peux passer a mon probleme suivant ;-)

    Cheers

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

Discussions similaires

  1. recherche sur un attribut collection
    Par avereyl dans le forum Hibernate
    Réponses: 1
    Dernier message: 06/08/2007, 11h13
  2. Réponses: 3
    Dernier message: 13/03/2007, 16h00
  3. Erreur code recherche multi-critères
    Par bétécé dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 23/11/2006, 11h14
  4. Rechercher les element d'une liste dans une autre liste
    Par fessebleu dans le forum Langage
    Réponses: 30
    Dernier message: 24/04/2006, 21h23
  5. Rechercher un element dans un msflexgrid et selection
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/11/2005, 08h09

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