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

Linq Discussion :

Linq to Xml [Exception sur un attribute]


Sujet :

Linq

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Points : 8
    Points
    8
    Par défaut Linq to Xml [Exception sur un attribute]
    Bonjour à tous,

    Voilà je vous explique, je développe un petit programme qui qui effectue un scan sur le réseaux grâce à NMAP qui généré un rapport en XML; mon programme doit juste récupéré les information puis par la suite, les comparées à d'autre info. Le problème c'est que j'ai une exception NullReferenceException.

    Donc voici un exemple du fichier généré par NMAP :
    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
    18
    19
    20
    21
    22
     
    <runnmap>
       <host>
          <address addr="10.x.x.x." addrtype="ipv4"/>
          <address addr="00:00:00:00:00" addrtype="mac"/>
          <hostnames>
             <hostname name="pc1.domain.local"/>
          </hostnames>
          <os>
             <osclass vendor="Microsoft" osfamily="Windows" osgen="XP" accuracy="100"/>
          </os>
       </host>
       <host>
          <address addr="10.x.x.x." addrtype="ipv4"/>
          <address addr="00:00:00:00:00" addrtype="mac"/>
          <hostnames>
             <hostname name="pc2.domain.local"/>
          </hostnames>
          <os>
             <osclass vendor="Panasonic" osfamily="embedded" accuracy="100"/>
          </os>
          </host>
    Et voilà mon programme :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    XDocument xmlDoc = XDocument.Load(nmap.xml);
     
                IList<Host> lshost = null;
     
                lshost = (from host in xmlDoc.Root.Elements("host")
                              select new Host
                              {
                                  MacAddress = host.Elements("address")
                                              .Where(h => h.Attribute("addrtype").Value == "mac")
                                              .Select(h => h.Attribute("addr").Value)
                                              .FirstOrDefault(),
                                  IpAddress = host.Elements("address")
                                              .Where(h => h.Attribute("addrtype").Value == "ipv4")
                                              .Select(h => h.Attribute("addr").Value)
                                              .FirstOrDefault(),
                                  Hostname = host.Elements("hostnames")
                                              .Elements("hostname")
                                              .Select(h => h.Attribute("name").Value)
                                              .FirstOrDefault(),
                                  OperatingSystem = host.Elements("os")
                                                      .Elements("osclass")
                                                      .Select(h => h.Attribute("osgen").Value)
                                                      .FirstOrDefault(),
                              }
                                ).ToList<Host>();
    Si je prends le premier host tout seul, il n'y a pas de souci, mais pour le deuxième, comme il n'y a pas d'attribut "osgen" dans sa balise <osclass> il génère une exception NullReférenceException.

    Il n'y a pas un moyen de lui dire si tu trouve pas cette attribut OperatingSystem = "".
    J'ai même essayer de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OperatingSystem = host.Elements("os")
                                                      .Elements("osmatch")
                                                      .Select(h => h.Attribute("name").Value)
                                                      .DefaultIfEmpty(" ").FirstOrDefault(),
    Mais ça marche pas.

    Si vous avez des idées pour régler mon souci, ou pour le contourné...

    Merci à vous

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Dans ta classe host pour osgen tu pe mette dans le set
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    set {
    if(value!=null) 
    osgen = value;
    else
    osgen = "";
     }
    et pour la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OperatingSystem = host.Elements("os")
                                                      .Elements("osclass")
                                                      .Where(h => h.Attribute("osgen")!=null)
                                                      .Select(h => h.Attribute("osgen").Value)
                                                      .FirstOrDefault(),

  3. #3
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    h.Attribute("osgen") renvoie null si l'élément n'a pas d'attribut osgen. Le plus simple c'est d'utiliser Attributes à la place (ça renverra une collection vide)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                                  OperatingSystem = host.Elements("os")
                                                      .Elements("osclass")
                                                      .Attributes("osgen")
                                                      .Select(a => a.Value)
                                                      .DefaultIfEmpty(" ")
                                                      .FirstOrDefault(),

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    Franchement un grand MERCI à vous deux. J'étais vraiment perdu ...
    Vos deux solutions marche sans souci.


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

Discussions similaires

  1. Linq to xml - requete sur un attribut
    Par Gregory.M dans le forum Linq
    Réponses: 3
    Dernier message: 07/11/2008, 14h32
  2. [Linq to sql] Exception sur Count
    Par Arnard dans le forum Accès aux données
    Réponses: 14
    Dernier message: 27/10/2008, 15h59
  3. [Linq to sql] Exception sur Count
    Par Arnard dans le forum Linq
    Réponses: 14
    Dernier message: 27/10/2008, 15h59
  4. Apache Commons Configuration et XML : filtrer sur un attribut
    Par 84mickael dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 17/04/2008, 16h16
  5. [VB.Net][XML] Exception sur un readXML
    Par arnolem dans le forum VB.NET
    Réponses: 11
    Dernier message: 20/04/2006, 17h12

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