Linq to XML и несколько преобразований - PullRequest
1 голос
/ 23 октября 2009

У меня проблемы с поиском чего-нибудь в 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> являются приправы - они могут быть частью любого еда.

Я начал с ElementsAfterSelf и ElementsBeforeSelf и TakeWhile, но сталкиваюсь со стенами, понимая, как выполнить вышеизложенное. Я использую VB.NET и Linq, но могу читать C #.

Есть мысли или указатели?

Ответы [ 2 ]

3 голосов
/ 25 октября 2009

Получил хороший ответ с другого форума и вот финал:

    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 голосов
/ 23 октября 2009

Может оказаться полезным LINQPad . Я бы решил вашу проблему, но мне не ясна указанная вами логика комбинации, так как она не соответствует примеру, как я понимаю (например, почему горчица не в каждом приеме пищи?) 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...