2009-10-23 5 views
1

Linq에서 뭔가를 알아 내는데 어려움을 겪고 있습니다. 누군가가 나에게 몇 가지 팁을 줄 수 있습니다.Linq to XML 및 다중 변환

새로운 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#을 읽을 수있다.

어떤 생각이나 포인터입니까?

답변

3

다른 포럼에서 좋은 대답을 얻었다 여기에 최종의 :

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

LINQPad이 유용 할 수 있습니다. 나는 문제를 풀어 주겠지 만, 당신이 지정한 조합 논리에 대해서는 명확하지 않습니다. 이해할 때 (예를 들어, 왜 모든 식사에서 겨자가 아닌지요?) 예제와 일치하지 않기 때문입니다.

+0

감사합니다. 나는 LinqPad를 사용하고 있습니다. 겨자 한 번만 먹기 때문에 모든 식사에 포함되어 있지 않으므로 위의 예에서 다음 식사는 쇠고기가 새 쇠고기로 바뀌는시기를 기준으로합니다. –