XDocument containing namespaces XDocument containing namespaces xml xml

XDocument containing namespaces


Try this, works for me

    XNamespace nsSys = "http://schemas.microsoft.com/2004/06/windows/eventlog/system";    XElement xEl2 = xDoc.Element(nsSys + "System");    XElement xEl3 = xEl2.Element(nsSys + "Correlation");    XAttribute xAtt1 = xEl3.Attribute("ActivityID");    String sValue = xAtt1.Value;

You need to use Namespaces.

Full source for trial

        public static void Main()        {            XElement xDoc = XElement.Parse(            @"<E2ETraceEvent xmlns=""http://schemas.microsoft.com/2004/06/E2ETraceEvent"">     <System xmlns=""http://schemas.microsoft.com/2004/06/windows/eventlog/system"">         <EventID>589828</EventID>         <Type>3</Type>         <SubType Name=""Information"">0</SubType>         <Level>8</Level>         <TimeCreated SystemTime=""2010-06-01T09:45:15.8102117Z"" />         <Source Name=""System.ServiceModel"" />         <Correlation ActivityID=""{00000000-0000-0000-0000-000000000000}"" />         <Execution ProcessName=""w3wp"" ProcessID=""5012"" ThreadID=""5"" />         <Channel />         <Computer>TESTSERVER3A</Computer>     </System>     <ApplicationData>         <TraceData>             <DataItem>                 <TraceRecord xmlns=""http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord"" Severity=""Information"">                     <TraceIdentifier>http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Activation.WebHostCompilation.aspx</TraceIdentifier>                     <Description>Webhost compilation</Description>                     <AppDomain>/LM/W3SVC/257188508/Root-1-129198591101343437</AppDomain>                     <Source>System.ServiceModel.Activation.ServiceParser/39498779</Source>                     <ExtendedData xmlns=""http://schemas.microsoft.com/2006/08/ServiceModel/StringTraceRecord"">                         <VirtualPath>/Service.svc</VirtualPath>                     </ExtendedData>                 </TraceRecord>             </DataItem>         </TraceData>     </ApplicationData> </E2ETraceEvent>");            XNamespace nsSys = "http://schemas.microsoft.com/2004/06/windows/eventlog/system";            XElement xEl2 = xDoc.Element(nsSys + "System");            XElement xEl3 = xEl2.Element(nsSys + "Correlation");            XAttribute xAtt1 = xEl3.Attribute("ActivityID");            String sValue = xAtt1.Value;            Console.WriteLine("sValue = {0}", sValue);            Console.ReadKey();        }


Anthony's addressed the namespace bit - and XAttribute has an explicit conversion to GUID, so this should work:

XNamespace eventNs = "http://schemas.microsoft.com/2004/06/E2ETraceEvent";XNamespace systemNs = "http://schemas.microsoft.com/2004/06/windows/eventlog/system";Guid guid = (Guid) document.Element(eventNs + "E2ETraceEvent")                           .Element(systemNs + "System")                           .Element(systemNs + "Correlation")                           .Attribute("ActivityID");

Note how namespaces are not inherited for attributes.

Using a single statement as I've done here can sometimes make life simpler, but it does make debugging harder as you don't get to see the intermediate values. Modify according to taste :)


Use XNamespace objects in your query for the given "xmnls=" tags in the elements you wish to query. Haven't tested, but something like this should work

XNamespace eventSpace = "http://schemas.microsoft.com/2004/06/E2ETraceEvent";XNamespace systemSpace = "http://schemas.microsoft.com/2004/06/windows/eventlog/system";XElement eventElement = document.Element(eventSpace + "E2ETraceEvent");XElement systemElement = eventElement.Element(systemSpace + "System");