Jeg sidder pt. og laver noget kode til at få vist nogle log filer fra en IIS. Jeg løb hertil formiddag ind i et problem, som jeg mener løsningen til, godt kunne være pakket bedre ind i .NET frameworket.
Forstil jer at skulle dette simple XML med LINQ.
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type='text/xsl' href='freb.xsl'?>
<!-- saved from url=(0014)about:internet -->
<failedRequest url="http://localhost:80/"
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/>
<EventID>0</EventID>
<Version>1</Version>
<Level>0</Level>
<Opcode>1</Opcode>
<Keywords>0x0</Keywords>
<TimeCreated SystemTime="2009-11-15T14:12:08.325Z"/>
<Correlation ActivityID="{00000000-0000-0000-0800-0080010000FB}"/>
<Execution ProcessID="1872" ThreadID="5176"/>
<Computer>DANIELDPEDK-PC</Computer>
</System>
</Event>
</failedRequest>
I min verden er det lige ud af landevejen. Jeg ville gøre således i første hug.
XDocument xml = XDocument.Load(@"C:\Users\danielmf\Desktop\Kode\XmlDesc\XmlDesc\XmlFile1.xml", LoadOptions.None);
var q = xml.Descendants("Event").ToList();
Ovenstående virker ikke, det fandt jeg hurtigt ud. Jeg må ærligt indrømme at det tog mig noget tid at finde frem til fejlen.
For at loade elementer som har et namespace på sig er man nødt til at gøre følgende.
XDocument xml = XDocument.Load(@"C:\Users\danielmf\Desktop\Kode\XmlDesc\XmlDesc\XmlFile1.xml", LoadOptions.None);
XNamespace ns = "http://schemas.microsoft.com/win/2004/08/events/event";
var q = xml.Descendants(ns + "Event").ToList();
Om jeg synes det er hensigtsmæssigt eller elegant. Nej.