Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XDocument containing namespaces

I have the following XML which I am trying to query with XDocument:

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

Executing the following code returns null for xEl1 except when I manually remove the namespaces:

XDocument xDoc = XDocument.Parse(CurrentString); XElement xEl1 = xDoc.Element("E2ETraceEvent"); XElement xEl2 = xEl1.Element("System"); XElement xEl3 = xEl2.Element("Correlation"); XAttribute xAtt1 = xEl3.Attribute("ActivityID"); String sValue = xAtt1.Value; 

How do you write code to extract the Guid in XDocument?

like image 712
Gineer Avatar asked Jun 08 '10 15:06

Gineer


People also ask

How to create XML namespace in c#?

To create an element or an attribute that's in a namespace, you first declare and initialize an XNamespace object. You then use the addition operator overload to combine the namespace with the local name, expressed as a string. The following example creates a document with one namespace.

What is namespaces in Xlm document?

An XML namespace is a collection of names that can be used as element or attribute names in an XML document. The namespace qualifies element names uniquely on the Web in order to avoid conflicts between elements with the same name.

What is an XDocument?

The XDocument class contains the information necessary for a valid XML document, which includes an XML declaration, processing instructions, and comments. You only have to create XDocument objects if you require the specific functionality provided by the XDocument class.

What is namespace in SOA?

A Namespace is a set of unique names. Namespace is a mechanisms by which element and attribute name can be assigned to a group. The Namespace is identified by URI(Uniform Resource Identifiers).


1 Answers

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();         } 
like image 111
Binary Worrier Avatar answered Oct 09 '22 09:10

Binary Worrier