XDocument contenant des espaces de noms

J’ai le code XML suivant que je tente d’interroger avec XDocument:

  589828 3 0 8      TESTSERVER3A      http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Activation.WebHostCompilation.aspx Webhost compilation /LM/W3SVC/257188508/Root-1-129198591101343437 System.ServiceModel.Activation.ServiceParser/39498779  /Service.svc       

L’exécution du code suivant renvoie null pour xEl1, sauf lorsque je supprime manuellement les espaces de noms :

 XDocument xDoc = XDocument.Parse(CurrentSsortingng); XElement xEl1 = xDoc.Element("E2ETraceEvent"); XElement xEl2 = xEl1.Element("System"); XElement xEl3 = xEl2.Element("Correlation"); XAtsortingbute xAtt1 = xEl3.Atsortingbute("ActivityID"); Ssortingng sValue = xAtt1.Value; 

Comment écrivez-vous le code pour extraire le Guid dans XDocument?

Essayez ceci, travaille pour moi

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

Vous devez utiliser les espaces de noms .

Source complète pour le procès

  public static void Main() { XElement xDoc = XElement.Parse( @"  589828 3 0 8      TESTSERVER3A      http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Activation.WebHostCompilation.aspx Webhost compilation /LM/W3SVC/257188508/Root-1-129198591101343437 System.ServiceModel.Activation.ServiceParser/39498779  /Service.svc      "); XNamespace nsSys = "http://schemas.microsoft.com/2004/06/windows/eventlog/system"; XElement xEl2 = xDoc.Element(nsSys + "System"); XElement xEl3 = xEl2.Element(nsSys + "Correlation"); XAtsortingbute xAtt1 = xEl3.Atsortingbute("ActivityID"); Ssortingng sValue = xAtt1.Value; Console.WriteLine("sValue = {0}", sValue); Console.ReadKey(); } 

Anthony a abordé le bit d’espace de noms – et XAtsortingbute a une conversion explicite en GUID, cela devrait donc fonctionner:

 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") .Atsortingbute("ActivityID"); 

Notez que les espaces de noms ne sont pas hérités pour les atsortingbuts.

Utiliser une seule instruction comme je l’ai fait ici peut parfois simplifier la vie, mais cela rend le débogage plus difficile car vous ne voyez pas les valeurs intermédiaires. Modifier selon les goûts 🙂

Utilisez les objects XNamespace dans votre requête pour les balises “xmnls =” données dans les éléments que vous souhaitez interroger. Je n’ai pas testé, mais quelque chose comme ça devrait fonctionner

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