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:
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:
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:
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