2017-04-18 41 views
1

我已經閱讀了類似的主題,並且無法將其中顯示的方法適用於我自己的問題。這可能是因爲我對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); 
       } 
      } 
     } 
    } 

我敢肯定有一個更有效和高效的方式來解決問題,但我對此感到失落。任何和所有的援助將不勝感激。

回答

1

這裏的問題在於,您的任務是處理來自XML文件的事實數據庫信息。

不是數據分析的最佳場景。

更加有效和高效的方式,以適當的結構是有道理的解決這個問題

我會建議你創建一個關係數據庫(SQL Express的可能)。一旦數據庫安裝了一個簡單地使用數據的進程(坦率地說,你現在正在做什麼)來填充數據庫。

然後,您可以使用C#或SQL進行基本查詢,以提取當前任務所需的數據。

+0

我認爲你是對的。如果我只填充兩個表而不是一次完成,我應該能夠將計劃和實際分開,並使用routeID作爲運行SQL查詢以將數據以可用格式結合在一起的鍵。謝謝你的建議。 – Ryiun

1

如果你正在處理明確定義的模式,並且無法遷移它,你可能會考慮LINQ to XSD,它通過刪除大量不必要的代碼,幫助我在過去大有作爲。仔細觀察你的表現。