2011-10-01 89 views
3

我想使用LINQ從XML文檔中提取數據,並將其放置到一個列表提高的LINQ的XML對象查詢

<Data> 
<FlightData DTS="20110216 17:17" flight="1234" origin="CYYZ" dest="CYUL" aircraft="945"> 
    <TLDRequest> 
     <Airline>ABC</Airline> 
     <AcReg>C-FABC</AcReg> 
     <CalcType>T</CalcType> 
     <OAT>-05</OAT> 
     <Wind>060/10</Wind> 
     <Flaps>5</Flaps> 
     <Switches></Switches> 
     <Runways> 
      <Rwy>6L</Rwy> 
      <Rwy>6R</Rwy> 
     </Runways> 
     ... 
    </TLDRequest> 
    ... 
    </FlightData> 
</Data> 

在C#我的LINQ代碼工作 - 我可以從FlightData選項卡屬性,但我認爲它可能更有效率,特別是在從TLDRequest標籤獲取數據的領域。我可以通過使用最佳做法獲取和獲取兒童標籤獲得一些見解嗎?

public static List<ACARS_Phase> createAcarsPhaseObject(XDocument xDoc) 
    { 
     return (from ao in xDoc.Descendants("FlightData") 
       select new ACARS_Phase 
       { 
        FlightDate = DateTime.ParseExact(ao.Attribute("DTS").Value, "yyyyMMdd HH:mm", new CultureInfo("en-CA")), 
        FlightNumber = ao.Attribute("flight").Value, 
        Origin = ao.Attribute("origin").Value, 
        Destination = ao.Attribute("dest").Value, 
        InternalFinNumber = ao.Attribute("aircraft").Value, 

        OperatorCode = ao.Element("TLDRequest").Element("Airline").Value, 
        RegistrationNumber = ao.Element("TLDRequest").Element("AcReg").Value, 
        Wind = ao.Element("TLDRequest").Element("Wind").Value, 
        Flaps = ao.Element("TLDRequest").Element("Flaps").Value, 
        OAT = ao.Element("TLDRequest").Element("OAT").Value, 
       }).ToList(); 
    } 

問候

回答

3

您所查詢的是好的,一般來說。如果你想減少一些冗餘,可以考慮使用let來獲得一次TLDRequest元素,這樣你就可以少一點重複自己。

return (from ao in xDoc.Descendants("FlightData") 
     let request = ao.Element("TLDRequest") 
     select new AcARS_Phase 
     { 
       // stuff 
       OperatorCode = request.Element("Airline").Value, 
       RegistrationNumber = request.Element("AcReg").Value, 
       // etc. 
     }).ToList(); 
+0

+1使用'let'子句減少***噪音*** – xandercoded