如何使用C#和LINQ

时间:2017-04-18 20:55:51

标签: c# xml linq

我已经阅读了类似的主题,并且难以将其中显示的方法适应我自己的问题。这可能是因为我对LINQ和C#的理解很弱,因为我必须同时学习这个特定的项目。我们正在尝试从第三方路由管理软件包发送给我们的xml中提取路由传送数据。 因为xml表是以一种奇怪的方式构建的(或者在我看来似乎如此)我一直在努力找出一个合理的结构来提取诸如里程表,时间和帐户ID之类的值,因为它们分散在& #39;实际'元素和'计划'每条路线的元素。

这里是xml的示例,每个RouteDetailResponseEnvelopeRouteDetail都是一条路线:

<?xml version="1.0" encoding="utf-16"?>
<RouteDetailResponseEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ExtensionData />
    <responseStatusField>
        <ExtensionData />
        <errorField />
        <warningField />
    </responseStatusField>
    <routeDetailListField>
        <RouteDetailResponseEnvelopeRouteDetail>
            <ExtensionData />
            <actualField>
                <ExtensionData />
                <deviceIDField>501</deviceIDField>
                <driverIDField>1393</driverIDField>
                <driverNameField>Ben Swain</driverNameField>
                <endOdometerField>925205</endOdometerField>
                <endTimeField>2017-04-17T16:20:18Z</endTimeField>
                <gPSPointListField />
                <lastGPSTransmissionTimeField>0001-01-01T00:00:00</lastGPSTransmissionTimeField>
                <routeFormsListField />
                <routeIDField>16631</routeIDField>
                <startOdometerField>925203</startOdometerField>
                <startTimeField>2017-04-17T05:23:10Z</startTimeField>
                <stopField>
                    <StopActualDetailType>
                        <ExtensionData />
                        <actualStopIDField>87994</actualStopIDField>
                        <coordinatesField>
                            <ExtensionData />
                            <latitudeField>46.4433823</latitudeField>
                            <longitudeField>-95.12942</longitudeField>
                        </coordinatesField>
                        <delayTimeField>0</delayTimeField>
                        <durationField>275</durationField>
                        <endTimeField>2017-04-17T09:58:39Z</endTimeField>
                        <inprogressField>false</inprogressField>
                        <legField>1</legField>
                        <odometerField>0</odometerField>
                        <orderField />
                        <sequenceField>0</sequenceField>
                        <startTimeField>2017-04-17T05:23:10Z</startTimeField>
                        <stopIDField>136897</stopIDField>
                    </StopActualDetailType>
                    <StopActualDetailType>
                        <ExtensionData />
                        <actualStopIDField>88012</actualStopIDField>
                        <coordinatesField>
                            <ExtensionData />
                            <latitudeField>46.4508057</latitudeField>
                            <longitudeField>-95.12929</longitudeField>
                        </coordinatesField>
                        <delayTimeField>0</delayTimeField>
                        <durationField>50</durationField>
                        <endTimeField>2017-04-17T10:49:50Z</endTimeField>
                        <inprogressField>false</inprogressField>
                        <legField>1</legField>
                        <odometerField>0</odometerField>
                        <orderField />
                        <sequenceField>1</sequenceField>
                        <startTimeField>2017-04-17T09:59:12Z</startTimeField>
                        <stopIDField>136898</stopIDField>
                    </StopActualDetailType>
                    <StopActualDetailType>
                        <ExtensionData />
                        <actualStopIDField>88123</actualStopIDField>
                        <coordinatesField>
                            <ExtensionData />
                            <latitudeField>46.4434357</latitudeField>
                            <longitudeField>-95.12943</longitudeField>
                        </coordinatesField>
                        <delayTimeField>274</delayTimeField>
                        <durationField>0</durationField>
                        <endTimeField>2017-04-17T16:20:18Z</endTimeField>
                        <inprogressField>false</inprogressField>
                        <legField>1</legField>
                        <odometerField>0</odometerField>
                        <orderField />
                        <sequenceField>2</sequenceField>
                        <startTimeField>2017-04-17T16:20:17Z</startTimeField>
                        <stopIDField>136899</stopIDField>
                    </StopActualDetailType>
                </stopField>
            </actualField>
            <planField>
                <ExtensionData />
                <delayTimeField>0</delayTimeField>
                <dispatchDateField>2017-04-17T05:00:00Z</dispatchDateField>
                <dispatchIDField>0417202</dispatchIDField>
                <endTimeField>2017-04-17T11:45:37Z</endTimeField>
                <lastDataPostedField>0001-01-01T00:00:00</lastDataPostedField>
                <lastDateModifiedField>2017-04-16T16:11:22.617</lastDateModifiedField>
                <loadDateField>2017-04-17T05:00:00Z</loadDateField>
                <routeIDField>16631</routeIDField>
                <rtNumberField>0</rtNumberField>
                <startTimeField>2017-04-17T10:40:00Z</startTimeField>
                <stopField>
                    <StopPlanDetailType>
                        <ExtensionData />
                        <accountIDField>WADENA</accountIDField>
                        <actualStopIDField xsi:nil="true" />
                        <breakTimeField>0</breakTimeField>
                        <delayTimeField>0</delayTimeField>
                        <distanceField>0</distanceField>
                        <endTimeField>2017-04-17T10:55:00Z</endTimeField>
                        <estimateEndTimeField>2017-04-17T10:55:00Z</estimateEndTimeField>
                        <estimateStartTimeField>2017-04-17T10:40:00Z</estimateStartTimeField>
                        <fixedTimeField>0</fixedTimeField>
                        <hasTimeActualField>false</hasTimeActualField>
                        <hasTimeViolationField>false</hasTimeViolationField>
                        <isTerminalField>true</isTerminalField>
                        <layoverTimeField>0</layoverTimeField>
                        <legField>1</legField>
                        <orderField>
                            <OrderDetailPlanDetailType>
                                <ExtensionData />
                                <accountIDField>WADENA</accountIDField>
                                <accountKeyIDField>0</accountKeyIDField>
                                <lineItemField>
                                    <LineItemDetailPlanType>
                                        <ExtensionData />
                                        <lineItemIDField>WADENA</lineItemIDField>
                                        <lineItemKeyIDField>139092</lineItemKeyIDField>
                                        <planField>
                                            <ExtensionData />
                                            <quantityFieldListField />
                                            <userFieldListField />
                                        </planField>
                                    </LineItemDetailPlanType>
                                </lineItemField>
                                <orderIDField>WADENA_20170417_001_136897</orderIDField>
                                <orderKeyIDField>139092</orderKeyIDField>
                                <orderStatusField>ERPToDRTrack</orderStatusField>
                                <shipToKeyIDField>0</shipToKeyIDField>
                            </OrderDetailPlanDetailType>
                        </orderField>
                        <sequenceField>0</sequenceField>
                        <startTimeField>2017-04-17T10:40:00Z</startTimeField>
                        <stopIDField>136897</stopIDField>
                        <violationsField />
                        <waitTimeField>0</waitTimeField>
                    </StopPlanDetailType>
                    <StopPlanDetailType>
                        <ExtensionData />
                        <accountIDField>180</accountIDField>
                        <actualStopIDField xsi:nil="true" />
                        <breakTimeField>0</breakTimeField>
                        <delayTimeField>0</delayTimeField>
                        <distanceField>1</distanceField>
                        <endTimeField>2017-04-17T11:28:37Z</endTimeField>
                        <estimateEndTimeField>2017-04-17T06:12:37Z</estimateEndTimeField>
                        <estimateStartTimeField>2017-04-17T05:41:00Z</estimateStartTimeField>
                        <fixedTimeField>15</fixedTimeField>
                        <hasTimeActualField>false</hasTimeActualField>
                        <hasTimeViolationField>false</hasTimeViolationField>
                        <isTerminalField>false</isTerminalField>
                        <layoverTimeField>0</layoverTimeField>
                        <legField>1</legField>
                        <orderField>
                            <OrderDetailPlanDetailType>
                                <ExtensionData />
                                <accountIDField>180</accountIDField>
                                <accountKeyIDField>0</accountKeyIDField>
                                <eqCodeField />
                                <lineItemField>
                                    <LineItemDetailPlanType>
                                        <ExtensionData />
                                        <lineItemIDField>001</lineItemIDField>
                                        <lineItemKeyIDField>139093</lineItemKeyIDField>
                                        <planField>
                                            <ExtensionData />
                                            <quantityFieldListField>
                                                <QuantityFieldListQuantityField>
                                                    <ExtensionData />
                                                    <nameField>Cube</nameField>
                                                    <unloadRateField>0</unloadRateField>
                                                    <valueField>1</valueField>
                                                </QuantityFieldListQuantityField>
                                                <QuantityFieldListQuantityField>
                                                    <ExtensionData />
                                                    <nameField>Piece</nameField>
                                                    <unloadRateField>0</unloadRateField>
                                                    <valueField>13</valueField>
                                                </QuantityFieldListQuantityField>
                                            </quantityFieldListField>
                                            <userFieldListField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Comments</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Depot</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Current Route ID</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Current Sequence</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>SequenceMatt</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Special Intructions</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                            </userFieldListField>
                                        </planField>
                                    </LineItemDetailPlanType>
                                </lineItemField>
                                <orderIDField>AUTO_20170417_002</orderIDField>
                                <orderKeyIDField>139093</orderKeyIDField>
                                <orderStatusField>ERPToDRTrack</orderStatusField>
                                <shipToKeyIDField>0</shipToKeyIDField>
                            </OrderDetailPlanDetailType>
                            <OrderDetailPlanDetailType>
                                <ExtensionData />
                                <accountIDField>181</accountIDField>
                                <accountKeyIDField>0</accountKeyIDField>
                                <eqCodeField />
                                <lineItemField>
                                    <LineItemDetailPlanType>
                                        <ExtensionData />
                                        <lineItemIDField>001</lineItemIDField>
                                        <lineItemKeyIDField>139094</lineItemKeyIDField>
                                        <planField>
                                            <ExtensionData />
                                            <quantityFieldListField>
                                                <QuantityFieldListQuantityField>
                                                    <ExtensionData />
                                                    <nameField>Cube</nameField>
                                                    <unloadRateField>0</unloadRateField>
                                                    <valueField>190</valueField>
                                                </QuantityFieldListQuantityField>
                                                <QuantityFieldListQuantityField>
                                                    <ExtensionData />
                                                    <nameField>Piece</nameField>
                                                    <unloadRateField>0</unloadRateField>
                                                    <valueField>168</valueField>
                                                </QuantityFieldListQuantityField>
                                            </quantityFieldListField>
                                            <userFieldListField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Comments</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Depot</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Current Route ID</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Current Sequence</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>SequenceMatt</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                                <UserFieldListUserField>
                                                    <ExtensionData />
                                                    <nameField>Special Intructions</nameField>
                                                    <valueField />
                                                </UserFieldListUserField>
                                            </userFieldListField>
                                        </planField>
                                    </LineItemDetailPlanType>
                                </lineItemField>
                                <orderIDField>AUTO_20170417_003</orderIDField>
                                <orderKeyIDField>139094</orderKeyIDField>
                                <orderStatusField>ERPToDRTrack</orderStatusField>
                                <shipToKeyIDField>0</shipToKeyIDField>
                            </OrderDetailPlanDetailType>
                        </orderField>
                        <sequenceField>1</sequenceField>
                        <startTimeField>2017-04-17T10:57:00Z</startTimeField>
                        <stopIDField>136898</stopIDField>
                        <violationsField />
                        <waitTimeField>0</waitTimeField>
                    </StopPlanDetailType>
                    <StopPlanDetailType>
                        <ExtensionData />
                        <accountIDField>WADENA</accountIDField>
                        <actualStopIDField xsi:nil="true" />
                        <breakTimeField>0</breakTimeField>
                        <delayTimeField>274</delayTimeField>
                        <distanceField>1</distanceField>
                        <endTimeField>2017-04-17T11:45:37Z</endTimeField>
                        <estimateEndTimeField>2017-04-17T11:07:37Z</estimateEndTimeField>
                        <estimateStartTimeField>2017-04-17T10:52:37Z</estimateStartTimeField>
                        <fixedTimeField>0</fixedTimeField>
                        <hasTimeActualField>false</hasTimeActualField>
                        <hasTimeViolationField>false</hasTimeViolationField>
                        <isTerminalField>true</isTerminalField>
                        <layoverTimeField>0</layoverTimeField>
                        <legField>1</legField>
                        <orderField>
                            <OrderDetailPlanDetailType>
                                <ExtensionData />
                                <accountIDField>WADENA</accountIDField>
                                <accountKeyIDField>0</accountKeyIDField>
                                <lineItemField>
                                    <LineItemDetailPlanType>
                                        <ExtensionData />
                                        <lineItemIDField>WADENA</lineItemIDField>
                                        <lineItemKeyIDField>139095</lineItemKeyIDField>
                                        <planField>
                                            <ExtensionData />
                                            <quantityFieldListField />
                                            <userFieldListField />
                                        </planField>
                                    </LineItemDetailPlanType>
                                </lineItemField>
                                <orderIDField>WADENA_20170417_004_136899</orderIDField>
                                <orderKeyIDField>139095</orderKeyIDField>
                                <orderStatusField>ERPToDRTrack</orderStatusField>
                                <shipToKeyIDField>0</shipToKeyIDField>
                            </OrderDetailPlanDetailType>
                        </orderField>
                        <sequenceField>2</sequenceField>
                        <startTimeField>2017-04-17T11:30:37Z</startTimeField>
                        <stopIDField>136899</stopIDField>
                        <violationsField />
                        <waitTimeField>0</waitTimeField>
                    </StopPlanDetailType>
                </stopField>
                <totalDistanceCostField>176.92</totalDistanceCostField>
                <totalDistanceField>1.8</totalDistanceField>
                <totalDriveHrsField>PT4M</totalDriveHrsField>
                <totalLegsField>0</totalLegsField>
                <totalStopsField>1</totalStopsField>
                <totalWorkHrsField>PT1H5M37S</totalWorkHrsField>
                <violationsField />
            </planField>
        </RouteDetailResponseEnvelopeRouteDetail>

以下是我目前正在尝试使用的代码:

XmlDocument dom = new XmlDocument();
dom.LoadXml(ToXml(response2).ToString());
dom.PreserveWhitespace = true;
dom.Save("C:\\DRTrack XML Import Archive\\" + DateTime.Today.AddDays(-1).Date.ToString("MM-dd-yyyy") + ".xml");
XDocument thisXML = XDocument.Load("C:\\DRTrack XML Import Archive\\" + DateTime.Today.AddDays(-1).Date.ToString("MM-dd-yyyy") + ".xml");

var Routes = from a in thisXML.Descendants("RouteDetailResponseEnvelopeRouteDetail")
    select new
    {
        truckNum = a.Element("actualField").Element("deviceIDField").Value,
        driverNum = a.Element("actualField").Element("driverIDField").Value,
        odomEnd = a.Element("actualField").Element("endOdometerField").Value,
        endTime = a.Element("actualField").Element("endTimeField").Value,
        rteID = a.Element("actualField").Element("routeIDField").Value,
        odomStart = a.Element("actualField").Element("startOdometerField").Value,
        startTime = a.Element("actualField").Element("startTimeField").Value
    };

    foreach (var a in Routes)
    {
        var StopsA = from b in thisXML.Descendants("StopActualDetailType")
                     where b.Ancestors("actualField").Attributes("routeIDField").First().Value == a.rteID
                     select new
                     {
                          timaAtStop = b.Element("durationField").Value,
                          StopID = b.Element("stopIDField").Value
                     };

        foreach (var d in StopsA)
        {
             var StopsP = from f in thisXML.Descendants("OrderDetailPlanDetailType")
                          where f.Ancestors("planField").Attributes("routeIDField").First().Value == a.rteID
                          select new
                          {
                              accountID = f.Element("accountIDField").Value,
                              StopID = f.Ancestors("StopPlanDetailType").Attributes("stopIDField").First().Value,
                              cube = f.Descendants("QuantityFieldListQuantityField").Where(t => t.Attribute("nameField").Value == "Cube").First().Element("valueField").Value
                           };
             foreach (var q in StopsP)
             {
                 using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\dstrausser\Documents\XMLREADTEST.txt", true))
                 {
                     file.WriteLine(a.truckNum + "," + a.driverNum + "," + a.odomEnd + "," + a.odomStart + "," + a.startTime + "," + a.endTime + "," + a.rteID
                                                + "," + d.timaAtStop + "," + q.accountID + "," + q.cube);
                 }
             }
         }
    }

我确信有一种更有效和更有效的方法来处理这个问题,但我对这件事情感到迷茫。任何和所有的帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这里的问题在于您的任务是处理来自XML文件的事实数据库。

不是数据分析的最佳方案。

  

更有效和更有效地解决问题

我建议您创建一个关系数据库(可能是sql express),其中包含合理的结构。一旦设置了db,就会有一个简单地消耗数据的过程(坦率地做你正在做的事情)来填充数据库。

然后,您可以在C#或SQL中进行基本查询,以提取手头任务所需的数据。

答案 1 :(得分:1)

如果您正在处理定义良好的架构并且无法从中迁移,您可以考虑通过删除大量不必要的代码来过去帮助我的LINQ to XSD。仔细观察你的表现。