改进Linq-XML到对象的查询

本文关键字:查询 对象 Linq-XML 改进 | 更新日期: 2023-09-27 18:10:15

我想使用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>

我的Linq代码在c#工作-我可以从FlightData选项卡获得属性,但我认为它可以更有效,特别是在从tlrequest标签获取数据的领域。我能得到一些关于使用最佳实践获取和抓取子标签的见解吗?

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

改进Linq-XML到对象的查询

您的查询一般来说是好的。如果您想减少一些冗余,可以考虑使用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();