Xml के लिए Linq: तत्वों का चयन करता है, तो एक विशेषता मान एक IEnumerable <XElement>


8

मैं एक IEnumerable उद्देश्य यह है कि सिर्फ एक xml फ़ाइल से नोड्स मैं चाहते हैं बनाने में एक नोड मूल्य के बराबर:

IEnumerable<XElement> rosters = XDocument.Load("roster.xml") 
             .Elements("rosterlist") 
             .Elements("roster") 
             .Where(w => w.Element("division") 
                 .Value 
                 .Equals("SUPER AWESOME DIVISION")); 

तो यह का एक संग्रह है इन:

<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") 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)); 

मैं इस हालांकि ऐसा होता एक प्रश्न में शामिल होने का उपयोग करके .. उपयोगकर्ता का चयन userid
पर रोस्टरों में शामिल होने के यह इस

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); 
} 

आउटपुट की तरह कुछ जाना चाहते हैं:

User on roster  on Roster R1