我有麻烦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 有用的。我给你的问题去,但我不清楚在联合逻辑的,你指定的,因为它不匹配起来,例如我了解(例如,为什么不是芥末,在每一餐的?)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top