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

C# 如何在查询XDocument时使用类作为数据模型?,c#,linq-to-xml,C#,Linq To Xml,我有一个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>

我有一个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>
…但我不想将Xml反序列化到
家族
个人
类。我只想直接加载XDocument和查询,但在提供API时,使用XElement、XAttribute和XName并不友好。我意识到我需要类-
Family
&
Person
,但它们只是模型

我可以有一个Find方法来传递类似于:

IEnumerable<Person> people = someBusinessObj.Find(p => p.Forename == "Jeff");
IEnumerable people=someBusinessObj.Find(p=>p.Forename==“杰夫”);
更新

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

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

  • 使用类进行反序列化
  • 允许您的用户通过进行查询

  • 所有这些都只需要很少的努力就可以实现

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

  • 使用类进行反序列化
  • 允许您的用户通过进行查询

  • 所有这些都只需要很少的努力就可以实现

    您的类模型足以将XML反序列化到对象模型中吗?我希望如此……我序列化了对象模型,以便可以得到上面显示的XML。:)您可能需要检查Linq2Xsd是否更接近您想要执行的操作。@马丁:似乎是Microsoft开源项目。是否有计划在任何时候将此库作为.Net的一部分提供?您的类模型是否足以将XML反序列化到对象模型中?我希望如此…我序列化了对象模型,以便可以使用上面显示的XML。:)您可能需要检查Linq2Xsd是否更接近您想要执行的操作。@马丁:似乎是Microsoft开源项目。有没有计划在任何时候将这个库作为.Net的一部分提供?其想法是使用XDocument并编写Xml。使用Linq到Xml的查询不是很有说服力的——也就是说,不是所有人都习惯的,没有类型化和充满额外的查询语言。如果Linq到Xsd更成熟,并且是.Net的一部分(不是开源附加库),那么解决这个问题就更容易了。此时,我们将继续执行序列化和反序列化Xml的计划。但是,我仍然在寻找问题的答案其想法是使用XDocument并编写Xml。使用Linq到Xml的查询不是很有说服力的——也就是说,不是所有人都习惯的,没有类型化和充满额外的查询语言。如果Linq到Xsd更成熟,并且是.Net的一部分(不是开源附加库),那么解决这个问题就更容易了。此时,我们将继续执行序列化和反序列化Xml的计划。但是,我仍然在寻找问题的答案
    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;
            }
        }
    }
    
    IEnumerable<Person> people = someBusinessObj.Find(p => p.Forename == "Jeff");