我已经阅读了类似的主题,并且难以将其中显示的方法适应我自己的问题。这可能是因为我对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);
}
}
}
}
我确信有一种更有效和更有效的方法来处理这个问题,但我对这件事情感到迷茫。任何和所有的帮助将不胜感激。
答案 0 :(得分:1)
这里的问题在于您的任务是处理来自XML文件的事实数据库。
不是数据分析的最佳方案。
更有效和更有效地解决问题
我建议您创建一个关系数据库(可能是sql express),其中包含合理的结构。一旦设置了db,就会有一个简单地消耗数据的过程(坦率地做你正在做的事情)来填充数据库。
然后,您可以在C#或SQL中进行基本查询,以提取手头任务所需的数据。
答案 1 :(得分:1)
如果您正在处理定义良好的架构并且无法从中迁移,您可以考虑通过删除大量不必要的代码来过去帮助我的LINQ to XSD。仔细观察你的表现。