У меня есть XML-документ:
<?xml version="1.0" encoding="utf-8"?>
<Family xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Person member="father" id="0">
<Surname>Smith</Surname>
<Forename>Robert</Forename>
<Person member="son" id="1">
<Surname>Smith</Surname>
<Forename>Sam</Forename>
<Person member="son" id="2">
<Surname>Smith</Surname>
<Forename>Jeff</Forename>
</Person>
</Person>
<Person member="daughter" id="3">
<Surname>Smith</Surname>
<Forename>Sarah</Forename>
</Person>
</Person>
</Family>
... и несколько вспомогательных классов следующим образом:
[XmlRoot]
public class Family {
[XmlElement]
public List<Person> Person;
}
public class Person {
[XmlAttribute("member")]
public MemberType Member { get; set; }
[XmlAttribute("id")]
public int Id { get; set; }
[XmlElement]
public string Surname { get; set; }
[XmlElement]
public string Forename { get; set; }
[XmlElement("Person")]
public List<Person> People;
}
public enum MemberType {
Father,
Mother,
Son,
Daughter
}
Теперь, скажем, Family
имеет метод, определенный как таковой:
public IEnumerable<Person> Find (Func<Person, bool> predicate) {
// also, I know that this SelectMany will not work - assume this foreach works
// on a flattened list of people
foreach (var p in family.Person.SelectMany()) {
if(predicate(p)) {
yield return p;
}
}
}
... но я не хочу десериализовать XML в классы Family
и Person
.Я хотел бы просто загрузить XDocument и запросить его напрямую, но работа с XElement, XAttribute и XName не очень удобна при предоставлении API.Я понимаю, что мне нужны классы - Family
& Person
- но они просто модели.
Могу ли я иметь метод Find, где я могу передать что-то вроде:
IEnumerable<Person> people = someBusinessObj.Find(p => p.Forename == "Jeff");
Обновление
Я бы предпочел решение, не включающее проект с открытым исходным кодом (как ссылается @MartinHonnen).