C# 如何在查询XDocument时使用类作为数据模型?
我有一个Xml文档: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 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");