使用XPath /应用XSL转换遍历任意C#对象图

jam*_*kes 10 .net c# xml xslt xpath

我一直在寻找一个允许我将任意C#对象传递给XSL转换的组件.

这样做的天真方法是使用XmlSerializer序列化对象图; 但是,如果你有一个大的对象图,就性能而言,这可能会导致问题.诸如循环引用,延迟加载,代理等问题可能会使这里的水域更加混乱.

更好的方法是使用某种实现IXPathNavigable和XPathNavigator的Adapter类.我遇到的一个这样的例子是来自Byte-ForceObjectXPathNavigator - 但是,它的大多数关键文档都是俄语的,我的初步测试似乎表明它有一些怪癖和特质.

有没有人知道(a)关于这个特定英语的任何资源(概述,教程,博客文章等)或(b)提供相同或类似功能的任何其他替代方案?

Dou*_*rer 6

有一篇(非常)旧的MSDN文章标题为XPath使用ObjectXPathNavigator查询对象,它实现了一个类似的类(也称为ObjectXPathNavigator,有趣的是).我在很久以前就用它来查询Visual SourceSafe中的一些数据,并从更改日志中构建一个RSS提要,它运行得很好.但是,我没有用它做XSLT,所以我不确定它是否有效.另请注意,它是为Framework 1.0编写的,因此您可能需要为更新的frameoworks更新它.此外,现在可能有更好的方法来做到这一点,但它会给你一个起点(而且这篇文章很好地解释了它是如何工作的).

  • 不知道在哪里可以从提供的链接获取源代码甚至二进制文件。 (2认同)

Bev*_*van 2

听起来您要解决的问题似乎很有趣。

乍一看,我建议编写您自己的后代实现XPathNavigator- 只需要编写 20 多个方法,并且它们都没有特别困难的签名。

使用非缓存反射的简单实现会很慢,但作为概念证明可以很好地工作,并且如果/当这成为问题时,您可以进行更改以提高性能。

然而 ...

...我认为您可能会遇到一些源于您的方法的困难,而不是源于任何实施细节。

XML 文件(本质上)是元素和属性的简单层次结构 - 节点图中没有循环(也称为循环)。

XPath 表达式可以包含运算符“ //”,其广义上意味着搜索无限深度。(有关确切的定义,请参阅XPath 1.0的第 2.5 节。)

如果您将这样的表达式应用于具有交叉引用(也称为对象循环)的对象图,那么您将面临 XPath 求值器在尝试递归枚举有效无限图时进入无限循环的风险。

您可以通过某种方式跟踪父节点XPathNavigator并在检测到循环时抛出异常来解决此问题,但我不确定这是否可行。