Próbuję zobaczyć wszystkich moich znajomych z Facebookaktóry poszedł do jakiejś szkoły. Używam FQL, aby uzyskać plik xml, który zawiera wszystkich moich znajomych z ich informacjami edukacyjnymi. Ale nie mogę użyć FQL, aby wybrać tylko tych, którzy poszli do tej samej szkoły. Dlatego próbuję użyć Linq do XML, aby wybrać tylko tych, których potrzebuję. Wypróbowałem kilka metod, ale te, które mi się nie przydadzą, działają dla mnie.
Oto moje zapytanie linq:
XDocument doc = RemoveNamespace (XDocument.Load(url));
string[] search = {"Katho", "katho", "kortrijk" , "vhti"};
List<string> keys = new List<string>( search );
var user = (from usr in doc.Descendants("user")
select new fbUser
{
name = usr.Element("name").Value,
email = usr.Element("email").Value,
current_location = StringExtensions.checkNull(usr.Element("current_location").Value,""),
hometown_location = usr.Element("hometown_location").Value,
pic = StringExtensions.checkNull(usr.Element("pic_square").Value,"http://www.fox16.com/media/avatar/default.jpg"),
education_history = (from edu in usr.Descendants("education_info")
//where usr.Element("education_history").HasElements
where keys.Contains(edu.Element("name").Value)
select new Education
{
name = StringExtensions.checkNull(edu.Element("name"),""),
year = StringExtensions.checkNull(edu.Element("year"),""),
school_type = StringExtensions.checkNull(edu.Element("school_type"),""),
concentrations = from conc in edu.Descendants("concentrations")
where (edu.Element("concentrations").HasElements)
select new Concentration
{
name = StringExtensions.checkNull(conc.Element("concentration").Value, "")
}
})
}).Take(5)
;
EDYCJA: przykładowy plik xml można znaleźć tutaj:przykładowy XML
Jest jeszcze jeden problem: nazwa szkoły nie jest bezpośrednim atrybutem obiektu fbUser. Również w pliku xml nazwa szkoły może być tylko tutaj
<user><education_history><education_info><name>
Oto moje zdanie:
where usr.Element("education_history").Element("education_info").Element(name").value == "schoolname"
Problem polega na tym, że nie ma zawsze węzła education_history lub education_info w xml.
Potrzebuję również sposobu, aby obejść to ...
Każda pomoc w tym problemie jest bardzo doceniana.
Mam nadzieję że możesz mi pomóc!
Grtz
Odpowiedzi:
1 dla odpowiedzi № 1Odwołujesz się do a where
oświadczenie dotyczące użytkowników, którego nie ma w twojej próbce. Najlepsze zapytanie (select new fbUser
) wykonuje wybór dla wszystkich użytkowników. Jeśli chcesz filtrować listę użytkowników, musisz wstawić znak where
oświadczenie między from
i select
, lubię to:
var user = (from usr in doc.Descendants("user")
where usr.Element("education_history") != null
&& usr.Element("education_info").Element(name") != null
&& usr.Element("education_info").Element(name").value == "schoolname"
select new fbUser
{
//...
}
Powszechne nieporozumienie popełniono, gdyprzetwarzanie kwerend danych w LinQ jest to, że wynikowe zapytanie LinQ powinno być pojedynczą instrukcją, której nie musi być. W twoim przypadku zapytanie nie zostanie wykonane dopóki nie użyjesz Take(5)
komunikat. Więc jeśli masz problemy ze skonstruowaniem swojego where
oświadczenie, możesz odłożyć je do momentu, aż utworzysz select
część:
var query = (from usr in doc.Descendants("user")
select new fbUser
//...
var user = query.where(u =>
u.Element("education_history") != null
&& u.Element("education_info").Element(name") != null
&& u.Element("education_info").Element(name").value == "schoolname"
).Take(5);