2009-10-23 48 views
1

我有麻煩在Linq的東西 - 也許有人可以給我一些提示。Linq到XML和多個變換

我有XML,我需要轉換爲新的XML。這個問題是,我需要幾次迭代轉化才能做到正確。

源會是這個樣子:

<Meals> 
     <ketchup/> 
     <steak/> 
     <mustard/> 
     <thigh/> 
     <fillet/> 
     <penne/> 
     <drumstick/> 
     <steak/> 
     <ketchup/> 
     <fillet/> 
     <fillet/> 
     <macaroni/> 
     <drumstick/> 
     <thigh/> 
     <ketchup/> 
     <thigh/> 
     <fillet/> 
    </Meals> 

我想這怎麼最終被是:

<Meals> 
     <Meal> 
     <ketchup/> 
     <steak/> 
     <mustard/> 
     <thigh/> 
     </Meal> 
     <Meal> 
     <fillet/> 
     <penne/> 
     <drumstick/> 
     </Meal > 
     <Meal> 
     <steak/> 
     <ketchup/> 
     </Meal> 
     <Meal> 
     <fillet/> 
     </Meal> 
     <Meal> 
     <fillet/> 
     <macaroni/> 
     <drumstick/> 
     </Meal> 
     <Meal> 
     <thigh/> 
     <ketchup/> 
     </Meal> 
     <Meal> 
     <thigh/> 
     <fillet/> 
     </Meal> 
    </Meals> 

這裏的邏輯是:

  • <steak><fillet>是牛肉 肉類 - 在之前發生的任何事情或之後,它不是牛肉 部分的餐,只要它不是另一餐的一部分。如果牛肉是在牛肉後出現的,那麼新牛肉的元素就會產生新的一餐。
  • <thigh><drumstick>是 雞的肉 - 任何之前發生 或之後他們不是 雞肉是膳食的一部分,只要它不是已經又是一頓的一部分。如果雞肉在雞肉後出現,則新雞肉的元素會產生新的食物。
  • <macaroni><penne>是麪食任何發生在他們之前或之後的不是麪食的部分是 只要它還不是另一餐的一部分。如果麪食出現在麪食之後,則新麪食的元素會產生新的食物。
  • <ketchup> and <mustard> are 調味品 - 它們可以是任何 膳食的一部分。

我已經開始使用ElementsAfterSelf和ElementsBeforeSelf和TakeWhile,但是我正在運行到牆上,理解如何執行上述操作。我使用VB.NET和Linq,但可以閱讀C#。

任何想法或指針?

回答

3

得到了另一個論壇一個很好的答案,這裏是最後的:

Dim meals As XElement = <Meals> 
           <ketchup/> 
           <steak/> 
           <mustard/> 
           <thigh/> 
           <fillet/> 
           <macaroni/> 
           <drumstick/> 
           <thigh/> 
           <ketchup/> 
           <thigh/> 
           <fillet/> 
          </Meals> 
    Dim newMeals As XElement = <Meals/> 
    Dim meal As XElement = <Meal/> 
    Dim hasBeef As Boolean 
    Dim hasChicken As Boolean 
    For Each m In meals.Descendants() 
     Select Case m.Name 
      Case Is = "steak", "fillet" 
       If hasBeef Then 
        newMeals.Add(meal) 
        meal = <Meal/> 
        hasChicken = False 
       Else 
        hasBeef = True 
       End If 
       meal.Add(m) 
      Case Is = "drumstick", "thigh" 
       If hasChicken Then 
        newMeals.Add(meal) 
        meal = <Meal/> 
        hasBeef = False 
       Else 
        hasChicken = True 
       End If 
       meal.Add(m) 
      Case Else 
       meal.Add(m) 
     End Select 
    Next 
    newMeals.Add(meal) 
0

您可能會感到有用LINQPad。我會解決你的問題,但我不清楚你指定的組合邏輯,因爲它與我所瞭解的例子不匹配(例如,爲什麼每頓飯都不是芥末?)

+0

感謝。我正在使用LinqPad - 偉大的工具。芥末並不是每頓飯,因爲它只出現一次,因此根據它的位置,它是第一餐的一部分(下一餐,在上面的例子中,將基於牛肉何時切換到新牛肉)。 – 2009-10-23 19:54:12