如何通过linq将xaml对象图的一部分提取到xml?

时间:2008-09-05 13:01:34

标签: linq xaml linq-to-xml

我有一个序列化为xaml的对象图。它的样子的粗略样本是:

<MyObject xmlns.... >
    <MyObject.TheCollection>
        <PolymorphicObjectOne .../>
        <HiImPolymorphic ... />
    </MyObject.TheCollection>
</MyObject>

我想使用Linq to XML来提取TheCollection中的序列化对象。

注意MyObject在运行时可能会有不同的名称;我对任何实现相同接口的对象感兴趣,该接口有一个名为TheCollection的公共集合,其中包含IPolymorphicLol的类型。

我在运行时唯一知道的是我将找到集合的深度,并且集合元素被命名为``* .TheCollection`。其他一切都会改变。

将使用Linq从数据库中检索xml;如果我可以将两个查询组合起来,而不是获取整个序列化图形,然后提取集合对象,我会收回那些很好的集合。

2 个答案:

答案 0 :(得分:0)

威尔

通过查看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框架来分析程序集中的类型而不使用反射。

答案 1 :(得分:0)

@aku
是的,我知道xaml不包含任何基本类型或接口的指示。但我确实知道根对象的接口,以及集合在编译时保存的接口。

序列化图形作为XML存储在sql数据库中,我们使用linq将它们作为XElements检索。目前,与您的解决方案一起,我们仅限于反序列化图形,迭代它们,从集合中提取我们想要的对象,从中删除对它们的所有引用,然后处理它们的父项。这一切非常愚蠢。我希望有一个单冲程解决方案;沿着xpath的行,但与我们的linq到sql查询内联,返回我们正在寻找的元素......