包含的XDocument命名空间

问题描述:

我有下面的XML而我试图用的XDocument查询:为xEl1 包含的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> 

执行以下代码返回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; 

您需要使用Namespaces

受审完整的源

 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

命名空间是关键 – ChrisP 2013-10-24 22:55:27

+14

直到我意识到他们重写了'XNamespace'和'string'的+运算符,这对我来说完全没有任何意义。 Yucky恶心的恶作剧。 – 2013-12-23 09:57:19

+3

如果你想避免“+”运算符重载,你可以显式地从本地名称和命名空间创建XName,如下所示:'XName.Get(“System”,nsSys.NamespaceName)' – Coruscate5 2016-11-29 17:29:10

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

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

安东尼讨论了命名空间位 - 和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"); 

注意命名空间是如何继承属性。

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

+0

我想你的意思是隐式运营商转换? :) – 2014-09-26 15:11:52

+3

@MarkS:不,我的意思是明确的。请参阅http://msdn.microsoft.com/en-us/library/bb301657(v=vs.110).aspx – 2014-09-26 15:19:11