题
我有麻烦groking东西在皇宫-也许有人可以给我一些提示。
我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>
和<mustard>
都 调味品-他们可以将其一部分的任何 餐。
我已经开始与ElementsAfterSelf和ElementsBeforeSelf和TakeWhile,但我跑进入壁与我的理解是如何执行以上。我在使用VB.NET 和皇宫,但可以阅读。
任何思想或指点?
解决方案
有一个很好的答案,从另一个论坛和在这里的最后:
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)
其他提示
你可能会找到 LINQPad 有用的。我给你的问题去,但我不清楚在联合逻辑的,你指定的,因为它不匹配起来,例如我了解(例如,为什么不是芥末,在每一餐的?)
不隶属于 StackOverflow