Linq to Xml : 속성 값이 IEnumerable <XElement>의 노드 값과 같은 경우 요소 선택


8

xml 파일에서 원하는 노드가 포함 된 IEnumerable 개체를 만듭니다.

그래서 다음과 같은 컬렉션이 있습니다.

<rosterlist> 
    <roster> 
     <userid>1</userid> 
     <name></name> 
     <etc></etc> 
    </roster> 
    <roster> 
     <userid>2</userid> 
     <name></name> 
     <etc></etc> 
    </roster> 
</rosterlist> 

userid 특성이있는 사용자 만 잡고 싶습니다. 또한 rosters 컬렉션 내의 userid 노드입니다.

IEnumerable<XElement> users = XDocument.Load("user.xml") 
             .Elements("userlist") 
             .Elements("user") 
             .Where(w => rosters.Elements("userid") 
                  .Contains(w.Attribute("userid").Value)); 

하지만 오류가 발생합니다 :

'System.Linq.Enumerable.Contains (System.Collections.Generic.IEnumerable, TSource)'메서드의 형식 인수는 용법. 형식 인수를 명시 적으로 지정하십시오.

내 접근 방식에 문제가 있습니까?

6

하나의 문제는 마지막 코드 단편에서 ...Elements("userid")이 Value 속성에 의해 반환 된 String을 포함 할 수없는 XElement 객체의 목록을 반환한다는 것입니다. 이것은 쿼리를 조인을 사용하여

IEnumerable<XElement> rosters = obRoot.Elements("rosterlist").Elements("roster"); 
var rosterUserIds = (rosters.Elements("userid").Select(r => r.Value)); 
IEnumerable<XElement> users = obRoot.Elements("userlist").Elements("user") 
       .Where(u => rosterUserIds.Contains(u.Attribute("userid").Value)); 

그러나 나는이 작업을 수행 할 것 ... 작동합니다 .. 선택 사용자는이

string sXml = @" 
<root> 
<rosterlist> 
    <roster> 
     <userid>1</userid> 
     <name>R1</name> 
     <etc></etc> 
    </roster> 
    <roster> 
     <userid>2</userid> 
     <name>R2</name> 
     <etc></etc> 
    </roster> 
</rosterlist> 
<userlist> 
    <user userid='1'> 
     <name>User on roster</name> 
    </user> 
    <user userid='5'> 
     <name>User not on roster</name> 
    </user> 
</userlist> 
</root> 

"; 

XElement obRoot = XElement.Parse(sXml); 
var results = from user in obRoot.Elements("userlist").Elements("user") 
    join roster in obRoot.Elements("rosterlist").Elements("roster") 
    on user.Attribute("userid").Value equals roster.Element("userid").Value 
    select new {Name=user.Element("name").Value, RosterName=roster.Element("name").Value} ; 

foreach (var v in results) 
{ 
    Console.WriteLine("{0, -20} on Roster {1, -20}", v.Name, v.RosterName); 
} 

출력처럼 뭔가를 가고 싶어 사용자 ID
에 명단에 가입 :

User on roster  on Roster R1