在模式之间转换XML - XSLT还是对象?

时间:2009-02-13 13:12:02

标签: c# xml xslt

假设:

  • 两个相似且复杂的模式,我们称之为XmlA和XmlB。
  • 我们想要从XmlA转换为XmlB
  • 并非所有生成XmlB所需的信息都包含在XmlA中(需要进行数据库查找)

我是否可以使用XSLT,因为我需要在数据库中引用其他数据?如果是这样,支持使用XSLT而不是简单的旧对象映射和转换的参数是什么?我认为以下标准可能会影响这一决定:

  • 性能/速度
  • 内存使用
  • 代码重用/ comlpexity

该项目将以C#为基础。

感谢。

3 个答案:

答案 0 :(得分:4)

使用C#,您始终可以为XSLT转换提供扩展对象,因此这不是问题。

很难在没有模式和XML的情况下定性地说,但我想编译变换将比对象映射更快,因为你将不得不做相当多的轮重新发明。

此外,XSLT的一大优势是它的可维护性和可移植性。您可以通过模式更改快速调整XSLT文档,并且即使在监视文件的情况下也无需进行任何重建和删除。

可以根据你给我们的内容进行任何一种方式。

答案 1 :(得分:2)

我的问题是改变变换的可能性有多大?

如果它们不会有太大变化,我赞成在一个源代码中完成所有这些 - 这里就是C#。我会将XSD.exe(.NET XSD工具)生成的序列化类与数据层一起用于此类事情。

另一方面,如果转换集可能会发生变化 - 或者安装后可能需要'更正' - 那么我倾向于将XSLT和C#扩展组合到XSLT中。扩展机制很简单,如果使用XslCompiledTransform类型,性能非常好。

答案 2 :(得分:1)

如果数据不在xml中,则xslt会很痛苦。您可以使用xsl:document()提供其他文档,也可以使用xslt扩展方法(但供应商之间不支持)。因此,除非你在xslt上设置为死,否则在这种情况下听起来不是一个好选择(尽管我正确地使用了xslt的忠实粉丝)。

所以:如果可能的话,我可能会使用常规的命令式代码 - 流式传输(IEnumerable<T>)。当然,除非你有很多数据,否则这种细微差别是没有实际意义的。