如何在查询XDocument时使用类作为数据模型?

我有一个Xml文档:

   Smith Robert  Smith Sam  Smith Jeff    Smith Sarah    

……以及一些支持类如下:

  [XmlRoot] public class Family { [XmlElement] public List 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 People; } public enum MemberType { Father, Mother, Son, Daughter } 

现在,说Family有一个定义如下的方法:

 public IEnumerable Find (Func 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 反序列化为 FamilyPerson类。 我想简单地加载XDocument并直接查询 – 但是在提供API时使用XElement,XAttribute和XName并不那么友好。 我意识到我需要课程 – FamilyPerson – 但他们只是模特。

我可以使用Find方法来传递类似的内容:

 IEnumerable people = someBusinessObj.Find(p => p.Forename == "Jeff"); 

更新
我更喜欢不涉及开源项目的解决方案(如@MartinHonnen所述)。

为什么不想将XML反序列化为对象? 这将为您提供所需的编程接口。 我会:

  1. 使用XmlSerializer类反序列化。
  2. 允许用户通过Linq-to-Objects进行查询。

所有这些都需要很少的努力来实现!