2017-09-13 123 views
1

內的元素,我想提取一個XML文件中的信息(見下面的代碼的特定部分):LINQ - 獲取元素

<AssetsInterface> 
    <Assets> 
    <Asset> 
     <Vehicle> 
     <MaintenanceHistories> 
      <MaintenanceHistory> 
      <RepairDate>2014-07-02</RepairDate> 
      <Mileage>30692</Mileage> 
      <Dealer></Dealer> 
      <Activities> 
       <Activity> 
       <Code></Code> 
       <Description>Filtro de aceite</Description> 
       <Amount>0</Amount> 
       </Activity> 
       <Activity> 
       <Code></Code> 
       <Description>Revisión 30000</Description> 
       <Amount>0</Amount> 
       </Activity> 
      </Activities> 
      </MaintenanceHistory> 
      <MaintenanceHistory> 
      <RepairDate>2015-03-27</RepairDate> 
      <Mileage>63984</Mileage> 
      <Dealer></Dealer> 
      <Activities> 
       <Activity> 
       <Code></Code> 
       <Description>Filtro de aceite</Description> 
       <Amount>0</Amount> 
       </Activity> 
       <Activity> 
       <Code></Code> 
       <Description>Revisión 60000</Description> 
       <Amount>0</Amount> 
       </Activity> 
       <Activity> 
       <Code></Code> 
       <Description>Escobillas</Description> 
       <Amount>0</Amount> 
       </Activity> 
       <Activity> 
       <Code></Code> 
       <Description>Filtro de particulas</Description> 
       <Amount>0</Amount> 
       </Activity> 
      </Activities> 
      </MaintenanceHistory> 
     </MaintenanceHistories> 
     </Vehicle> 
    </Asset> 
    </Assets> 
</AssetsInterface> 

正如你可以看到,它有多個<MaintenanceHistory>與多個<Activities>它們內部。我找的輸出是這樣的:

2014-07-02 30692 Filtro de aceite 
2014-07-02 30692 Revisión 30000 
2015-03-27 63984 Filtro de aceite 
2015-03-27 63984 Revisión 60000 
2015-03-27 63984 Escobillas 
2015-03-27 63984 Filtro de partículas 

我沒有問題,提取<RepairDate><Mileage>,甚至我提取<Description>,但我不能這樣做一次。這是我目前可憐的代碼(X1000不同的嘗試後...):

For Each desc As XElement In document.Descendants("Activity") 
    carRepairDesc = desc.Element("Description") 

    For Each options As XElement In document.Descendants("MaintenanceHistory") 
     carRepairDate = options.Element("RepairDate").Value 
     carRepairKMs = options.Element("Mileage").Value 
    Next 
    Console.WriteLine(carRepairDate & " " & carRepairKMs & "km " & carRepairDesc) 
Next 

這段代碼的輸出是一個有點不同:

2015-12-28 96833km Filtro de aceite 
2015-12-28 96833km Revisión 30000 
2015-12-28 96833km Filtro de aceite 
2015-12-28 96833km Revisión 60000 
2015-12-28 96833km Escobillas 
2015-12-28 96833km Filtro de particulas 

我希望你有什麼建議!

編輯:

感謝@Hybridzz,這裏是VB.Net的解決方案:

Dim document As XDocument = XDocument.Load("PATH TO XML") 
Dim mHistory = From r In document.Descendants("MaintenanceHistory") Select New With { 
    Key .RepairDate = r.Element("RepairDate").Value, 
    Key .Mileage = r.Element("Mileage").Value, 
    Key .ActivityDescs = r.Descendants("Activity").[Select](Function(x) x.Element("Description").Value) 
    } 

For Each r In mHistory 
    For Each activityDesc In r.ActivityDescs 
     Console.WriteLine(String.Format("{0} {1} {2} {3}", r.RepairDate, r.Mileage, activityDesc, Environment.NewLine)) 

    Next 
Next 

回答

3

這是AC#版本,但你可以改變到VB .NET

XDocument document = XDocument.Load(@"PATH TO XML"); 

     var mHistory = from r in document.Descendants("MaintenanceHistory") 
        select new 
        { 
         RepairDate = r.Element("RepairDate").Value, 
         Mileage = r.Element("Mileage").Value, 
         ActivityDescs = r.Descendants("Activity").Select(x => x.Element("Description").Value) 
        }; 

     foreach (var r in mHistory) 
     { 
      foreach (var activityDesc in r.ActivityDescs) 
      { 
       Console.WriteLine(string.Format("{0} {1} {2} {3}", r.RepairDate, r.Mileage, activity, Environment.NewLine)); 
      } 

     } 

和輸出是

2014-07-02 30692 Filtro de aceite 
2014-07-02 30692 Revisión 30000 
2015-03-27 63984 Filtro de aceite 
2015-03-27 63984 Revisión 60000 
2015-03-27 63984 Escobillas 
2015-03-27 63984 Filtro de particulas 
+0

它像一個魅力。你拯救我的一天!你能解釋一下代碼嗎?我不明白「mHistory」var部分的工作原理。非常感謝! – smtdev

+0

這就是linq的美妙之處,我們從xml數據動態地創建新對象。'select new'將創建一個新的對象,其中定義了屬性。 – Hybridzz

+0

我會在將來使用它,當然。再次感謝你。 – smtdev