2009-04-01 6 views
4

모든 항목을 다시 가져올 수 있도록 같은 이름의 여러 항목이있는 xml 파일을 쿼리하려면 어떻게해야합니까? 현재 나는 첫 번째 결과 만 얻는다. 다음 코드로 작업 할 수 있었지만 특정 검색 기준이 충족되는 모든 항목을 반환합니다. 출력으로 원하는 것은 위치가 더블린 인 경우의 두 가지 결과를 다시 얻는 것입니다. 문제는 내가 여기 linq에 같은 이름의 모든 xml 항목을 반환하십시오.

string location = "Oslo";  
var training = (from item in doc.Descendants("item") 
         where item.Value.Contains(location) 

         select new 
         { 
          event = item.Element("event").Value, 
          event_location = item.Element("location").Value 
         }).ToList(); 

XML 파일이

<training> 
    <item> 
     <event>C# Training</event> 
     <location>Prague</location> 
     <location>Oslo</location> 
     <location>Amsterdam</location> 
     <location>Athens</location> 
     <location>Dublin</location> 
     <location>Helsinki</location> 
    </item>  
    <item> 
     <event>LINQ Training</event> 
     <location>Bucharest</location> 
     <location>Oslo</location> 
     <location>Amsterdam</location> 
     <location>Helsinki</location> 
     <location>Brussels</location> 
     <location>Dublin</location> 
    </item>    
</training> 

답변

4

당신 '처럼 보이는 코드, XML

건배 크리스에 LINQ와이를 달성 할 수있는 방법입니다 다시 item.Element("location")을 사용하여 첫 번째 위치 항목을 항목 아래에 반환합니다. 그것은 반드시 당신이 찾고 있던 위치가 아닙니다!

string location = "Oslo"; 
var training = from loc in doc.Descendants("location") 
       where loc.Value == location 
       select new 
       { 
        event = loc.Parent.Element("event").Value, 
        event_location = loc.Value 
       }; 

하지만 다시, event_location 다음 항상 쿼리에 전달했습니다 위치가 될 것 주어진 어떤 가치를 제공 않습니다

난 당신이 실제로 뭔가 더처럼 원하는 의심?

원하는 내용이 아닌 경우 자세한 내용을 입력하십시오. 질문은 현재 약간 이해하기 힘듭니다. 현재 코드가 제공하는 세부 사항과 이 원하는 것은입니다. "이름"이 의미하는 바는 물론 (실제로는 "가치"를 의미하는 것처럼 보입니다) 도움이 될 것입니다.

편집 : 좋아, 그래서 당신이 원하는 같은 소리 :

string location = "Oslo"; 
var training = from loc in doc.Descendants("location") 
       where loc.Value == location 
       select new 
       { 
        event = loc.Parent.Element("event").Value, 
        event_locations = loc.Parent.Elements("location") 
               .Select(e => e.Value) 
       }; 

event_locations 지금은 문자열의 순서 일 것이다. 당신은 당신이 원하는 출력을 얻을 수 있습니다

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 귀하의 코드를 사용해 보았지만 동일한 결과가 나타납니다. 나는 내가하고 싶은 것을 더 자세하게 기술했다. 건배 Chris – Chris

+0

안녕하세요 존, 도와 주셔서 다시 한 번 감사드립니다. 내가 놓친 것 같았던 부분은 Parent.Element 부분이었습니다. 이제 작동 중입니다 ... – Chris

0

이가 그 일을 가장 효율적인 방법하지 않을 수도 있습니다 ...

for (var entry in training) 
{ 
    Console.WriteLine("Event: {0}; Locations: {1}", 
         entry.event, 
         string.Join(", ", entry.event_locations.ToArray()); 
} 

이있는 시도를주고 당신이 원하는 무엇인지 볼 수 있지만,이 쿼리 작업 :

var training = (from item in root.Descendants("item") 
       where item.Value.Contains(location) 
       select new 
       { 
        name = item.Element("event").Value, 
        location = (from node in item.Descendants("location") 
           where node.Value.Equals(location) 
           select node.Value).FirstOrDefault(), 
       }).ToList(); 

(속성 이름이 event 인 경우 코드가 컴파일되지 것입니다 있습니다, 그래서 name로 변경되었습니다.)

을 나는 PROB 생각 코드를 사용하는 경우 익명 형식을 만들 때 location 노드를 검색 할 때 원하는 값으로 노드를 검색하지 못했습니다.

관련 문제