我已經閱讀了類似的主題,並且無法將其中顯示的方法適用於我自己的問題。這可能是因爲我對LINQ和C#的理解很薄弱,因爲我不得不爲這個特定的項目學習。我們正在嘗試從第三方路由管理軟件包發送給我們的xml中提取路由傳送數據。 因爲xml表的構造方式很奇怪(或者我認爲),我一直在努力找出一個合理的結構來提取諸如里程錶,時間和帳戶ID之類的值,因爲它們分散在「實際'元素和'計劃'元素爲每個路線。如何使用C#和LINQ提取XML內部的深層信息
這裏的每個RouteDetailResponseEnvelopeRouteDetail是一個路線的XML的一個樣本:
<?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);
}
}
}
}
我敢肯定有一個更有效和高效的方式來解決問題,但我對此感到失落。任何和所有的援助將不勝感激。
我認爲你是對的。如果我只填充兩個表而不是一次完成,我應該能夠將計劃和實際分開,並使用routeID作爲運行SQL查詢以將數據以可用格式結合在一起的鍵。謝謝你的建議。 – Ryiun