代码之家  ›  专栏  ›  技术社区  ›  Todd Main

linq到xml和多个转换

  •  1
  • Todd Main  · 技术社区  · 15 年前

    我在LINQ遇到麻烦了,也许有人能给我一些建议。

    我有需要转换成新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> 是 调味品-它们可以是任何的一部分。 膳食。

    我已经从元素自我和元素自我开始,在自我和接受的过程中,但是我已经进入了我的理解如何执行上述的墙壁。我正在使用vb.net和linq,但是可以读取c。

    有什么想法或建议吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Todd Main    15 年前

    从另一个论坛得到了一个很好的答案,这里是最后一个:

        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)
    
        2
  •  0
  •   Justin R.    15 年前

    你可能会发现 LINQPad 有用的。我想试一试你的问题,但我不清楚你所指定的组合逻辑,因为它与我所理解的例子不符(例如,为什么每顿饭都没有芥末?)