包含命名空间的XDocument

我有下面的XML,我试图用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> 

除了手动删除名称空间时,执行以下代码将为xEl1返回null:

 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; 

你如何编写代码来提取XDocument中的Guid?

试试这个,为我工作

  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; 

你需要使用命名空间 。

完整的来源供试用

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

安东尼的命名空间位 – 和XAttribute具有显式转换为GUID,所以这应该工作:

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

请注意,名称空间不是为属性inheritance的。

像我在这里所做的那样使用单个语句有时会使生活变得更简单,但是它使debugging更加困难,因为您无法看到中间值。 根据口味修改:)

在查询中使用XNamespace对象,以查找要查询的元素中给定的“xmnls =”标记。 还没有testing,但是这样的事情应该工作

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