如何使用C#和LINQ提取XML深处的信息

如何使用C#和LINQ提取XML深处的信息,c#,xml,linq,C#,Xml,Linq,我已经阅读过类似的主题,并且很难根据我自己的问题调整其中显示的方法。这可能是因为我对LINQ和C#的理解很弱,因为在这个特定项目中,我必须学习这两个方面。我们正试图从第三方路由管理软件包发送给我们的xml中提取路由交付数据。 由于xml表是以一种奇怪的方式构造的(或者在我看来是这样),我一直在努力找出一种合理的结构来提取里程表、时间和帐户ID等值,因为它们分散在每个路由的“实际”元素和“计划”元素中 下面是一个xml示例,其中每个RoutedDetailResponseeDeveloperOut

我已经阅读过类似的主题,并且很难根据我自己的问题调整其中显示的方法。这可能是因为我对LINQ和C#的理解很弱,因为在这个特定项目中,我必须学习这两个方面。我们正试图从第三方路由管理软件包发送给我们的xml中提取路由交付数据。 由于xml表是以一种奇怪的方式构造的(或者在我看来是这样),我一直在努力找出一种合理的结构来提取里程表、时间和帐户ID等值,因为它们分散在每个路由的“实际”元素和“计划”元素中

下面是一个xml示例,其中每个RoutedDetailResponseeDeveloperOutletail都是一个路由:

<?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>

我确信有一种更有效的方式来解决这个问题,但我对这件事感到茫然。非常感谢您提供的任何帮助。

目前的问题是,您的任务是处理XML文件中的实际信息数据库

不是数据分析的最佳方案

以更有效的方式解决问题

我建议您创建一个具有合理结构的关系数据库(可能是sql express)。一旦数据库被设置好,就有一个简单地使用数据(做你现在正在做的事情)来填充数据库的进程


你可以在C语言或SQL中进行基本的查询来提取手头所需要的数据。

如果你处理的是定义良好的模式,不能迁移,你可以考虑通过删除大量不必要的代码来帮助我。不过要仔细观察你的表现。

我认为你是对的。如果我只是填充两个表,而不是一次全部填充,那么我应该能够将计划表和实际表分开,并使用routeID作为键来运行SQL查询,以便以可用的格式将数据组合在一起。谢谢你的建议。
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);
                 }
             }
         }
    }