如何通过linq到xml提取xaml对象图的一部分?
时间:2020-03-05 18:48:12 来源:igfitidea点击:
我有一个对象图序列化为xaml。粗略的外观示例是:
<MyObject xmlns.... > <MyObject.TheCollection> <PolymorphicObjectOne .../> <HiImPolymorphic ... /> </MyObject.TheCollection> </MyObject>
我想使用Linq到XML,以提取TheCollection中的序列化对象。
注意:在运行时,MyObject
的名称可能不同。我对实现相同接口的任何对象都感兴趣,该对象有一个名为" TheCollection"的公共集合,其中包含" IPolymorphicLol"的类型。
我在运行时唯一了解的是找到集合的深度,集合元素的名称为``* .TheCollection`。其他一切都会改变。
xml将使用Linq从数据库中检索。如果我可以将两个查询组合在一起,那么不必获取整个序列化图然后提取集合对象,我就可以取回很甜的集合。
解决方案
回答
将要,
通过查看XAML不可能找出对象是否实现了某些接口。
有了约束,我们可以找到具有名为的子元素的xml元素。
我们可以使用以下代码:
它将返回所有具有以.TheCollection结尾的子元素的元素。
static IEnumerable<XElement> FindElement(XElement root) { foreach (var element in root.Elements()) { if (element.Name.LocalName.EndsWith(".TheCollection")) { yield return element.Parent; } foreach (var subElement in FindElement(element)) { yield return subElement; } } }
为了确保此元素表示的对象实现某些接口,我们需要从程序集中读取元数据。我建议我们使用Mono.Cecil框架在不使用反射的情况下分析程序集中的类型。
回答
@aku
是的,我知道xaml不包含任何有关基本类型或者接口的指示。但是我确实知道根对象的接口以及集合在编译时所拥有的接口。
序列化的图以XML格式存储在sql数据库中,我们使用linq来将它们检索为XElement。当前,与解决方案一起,我们仅限于对图形进行反序列化,遍历它们,从集合中提取所需的对象,从其父级中删除对它们的所有引用,然后处置它们的父级。一切都很混乱。我希望有一个简单的解决方案。类似于xpath的内容,但与我们的linq to sql查询内联,该查询仅返回我们正在寻找的元素...