2010-06-08 14 views
35

Tengo el siguiente código XML que estoy tratando de consultar con XDocument:XDocument que contiene espacios de nombres

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

ejecutar el código siguiente devuelve nulo para xEl1 excepto cuando se quita manualmente los espacios de nombres:

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; 

¿Cómo se escribe el código para extraer el Guid en XDocument?

Respuesta

51

probar esto, que funciona para mí

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; 

Es necesario utilizar Namespaces.

fuente completo para el juicio

 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(); 
     } 
+0

El espacio de nombre es la clave – ChrisP

+14

Eso no tenía ningún sentido para mí hasta que me di cuenta de que estaban anulando el operador + para 'XNamespace' y' string'. Yucky asqueroso. –

+3

Si desea evitar la sobrecarga del operador "+", puede crear el XName explícitamente a partir de un nombre local y un espacio de nombres como este: 'XName.Get (" System ", nsSys.NamespaceName)' – Coruscate5

1

Utilice objetos XNamespace en su consulta para las etiquetas "xmnls =" dadas en los elementos que desea consultar. no se han probado, pero algo como esto debería funcionar

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"); 
20

Anthony abordado el poco espacio de nombres - y XAttribute tiene una conversión explícita a GUID, así que esto debería funcionar:

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"); 

Nota cómo los espacios de nombres son no heredaron para atributos

El uso de un solo estado como he hecho aquí a veces puede hacer la vida más simple, pero lo hace maquillaje depuración más difícil, ya que no llega a ver los valores intermedios. Modificar de acuerdo al gusto :)

+0

Creo que quiere decir implícito conversión del operador? :) –

+3

@MarkS: No, quiero decir explícito. Ver http://msdn.microsoft.com/en-us/library/bb301657(v=vs.110).aspx –

Cuestiones relacionadas