Domanda

Sto riscontrando problemi a mettere a fuoco qualcosa in Linq - forse qualcuno può darmi qualche consiglio.

Ho XML che devo trasformare in nuovo XML. Il problema è che ho bisogno di diverse iterazioni di trasformazione per farlo bene.

La fonte sarebbe simile a questa:

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

Quello che vorrei che finisse per essere è:

    <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>

La logica qui è che:

  • <steak> e <fillet> sono carne di manzo carni - tutto ciò che accade prima o dopo di loro che non è una carne di manzo parte del pasto purché non sia già parte di un altro pasto. Se la carne di manzo si presenta dopo una carne di manzo, viene creato un nuovo pasto all'elemento della nuova carne di manzo.
  • <thigh> e <drumstick> sono carni di pollo - qualsiasi cosa accada prima o dopo di loro che non è un la carne di pollo fa parte del pasto purché non faccia già parte di un altro pasto. Se la carne di pollo si presenta dopo una carne di pollo, viene creato un nuovo pasto nell'elemento della nuova carne di pollo.
  • <macaroni> e <penne> sono paste qualsiasi cosa si verifichi prima o dopo di loro che non sia una pasta parte del pasto purché non sia già parte di un altro pasto. Se la pasta si presenta dopo una pasta, viene creato un nuovo pasto sull'elemento della nuova pasta.
  • <ketchup> e <mustard> sono condimenti - possono far parte di qualsiasi pasto.

Ho iniziato con ElementsAfterSelf e ElementsBeforeSelf e TakeWhile, ma sto correndo contro i muri con la mia comprensione di come eseguire quanto sopra. Sto usando VB.NET e Linq, ma posso leggere C #.

Qualche idea o suggerimento?

È stato utile?

Soluzione

Ho una buona risposta da un altro forum ed ecco la finale:

    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)

Altri suggerimenti

Potresti trovare LINQPad utile. Proverei il tuo problema, ma non sono chiaro sulla logica di combinazione che hai specificato, in quanto non corrisponde all'esempio come lo capisco (ad esempio, perché la senape non è in ogni pasto?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top