XSLT与XMLDocument数据类型->使用foreach ->附加到文字控件

本文关键字:控件 文字 使用 XMLDocument 数据类型 XSLT foreach | 更新日期: 2023-09-27 18:19:05

我有一个关于使用。net框架在c#中样式化XML的问题。我在一个网站上工作,有99%的数据存储为XML。通常,我坚持使用XSLT来转换XML,或者将XML读入XMLDocument数据类型,使用XPATH对其进行解析,然后基本上将输出附加到整个页面的Literal服务器控件中以处理显示。我有一种感觉,就内存而言,后者的开销要大得多,因为我要将XML读入数据类型,并用foreach语句和其他逻辑语句循环遍历节点。我通常这样做的唯一原因是我觉得这样做更舒服,而且因为我绝不是XSL专家,所以这是我可以完成我需要做的事情的唯一方法。我想我想知道是否有人知道贵多少这样做?除了我正在解析的xml的大小之外,还有哪些因素可能会影响它。提前谢谢你。

XSLT与XMLDocument数据类型->使用foreach ->附加到文字控件

在Jon Bentley的经典著作中已经证明,用Assembler实现的坏算法比用Basic实现的好算法执行速度慢数千倍。

因此,说"技术A比技术B快"是完全不正确的。

至于所消耗的内存,很大程度上取决于XML文档的大小。XmlDocument和典型的XSLT 1.0或2.0处理器都在内存中构建完整XML文档的表示,因此在这两种情况下处理多gb的XML文档都是有问题的。

XSLT 3.0(仍处于工作草案状态)有一个流特性,它允许以流模式处理XML文档,前提是转换中使用的XPath表达式遵守某些限制。

我认为考虑一组指标比只考虑一个指标更有用。

XSLT是专门为处理树形结构而设计的语言,因此它提供了其他语言没有的有价值的特性。两个例子是模板模式匹配

使用模板和模式匹配,可以声明性地表达一个转换。代码更简单、更短、更容易理解和维护、可扩展。编写XSLT代码通常可以在几分钟内完成,而用过程语言编写过程式的面条式代码则需要数小时。

用函数式语言调试程序,甚至证明正确性都要容易得多,因为变量是不可变的。

由于同样的原因,XSLT处理器有更大的可能性进行非常积极的优化。

最后,让我来反驳一下@dash:

的一个很好的回答。

xslt可以有效地作为输出HTML。

另一方面,特别是2,你就失去了很多asp.net所能提供的伟大特性,从web表单到MVC。假设您最终想要填充asp.net服务器控制,你这样做是好的,否则你就是运行XSLT只是为了获取值

实际上,有一种编写XSLT的风格,在内容和处理之间有严格而清晰的分离(我称之为填空模式)。

例如,我对问题的回答

以下是使用这种方法开发XSLT应用程序的一些优点:

  1. 此代码可以使用来自任何数据文档的数据填充任何渲染文档(路径作为外部参数传递)(同样路径作为外部参数传递)。因此,可以创建不同的输出/格式来填充不同的数据。

  2. 要用"live content"替换的占位符(gen:data元素)可以有不同的格式和语义——不限制一个人的想象力。

  3. 编辑(非XSLT专家)可以独立于彼此和XSLT开发人员处理一个或多个呈现文档。

  4. 实现了更高程度的可重用性、灵活性和可维护性。

总结一下:使用基于dom的过程性语言转换XML的方法,虽然可能,但在开发资源方面成本更高,并且在代码复杂性、可理解性、可维护性和可扩展性方面质量较差。

Xslt在相同的原则下工作;它将其加载到DOM中(尽管通常不是XmlDocument——有一种轻量级的只读模型可用——XPathDocument),并执行xpath表达式(最终在节点上循环)。

写得不好的xslt会很慢,写得不好的c#也会很慢。要知道哪一种更快,您需要进行分析,注意也可以简单地改进您当前的代码(无论是哪一种)。

除了Marc的回答,还有其他一些事情需要考虑;

  1. 您的xslt文件可以独立于重新编译代码进行编辑。我在一个与你描述的类似的系统上工作过,独立于更改代码部署转换的能力很有用;重新编译和重新部署所有二进制文件比部署单个xslt要困难得多。

  2. Xslt到HTML可以比XML解析、文字和设置文字的大量代码等的组合干净得多。xslt可以有效地作为输出HTML。

另一方面,特别是2,你就失去了asp.net可以提供的许多伟大的特性,从web表单到MVC。如果您最终想要填充一个asp.net服务器控件,那么您这样做是可以的,否则您将运行xslt只是为了获取值—这并不是xslt的真正用途(它将XML从一种结构转换为另一种结构)。

就性能而言,您是对的,XML的大小很重要。如果您有200个用户,他们每个人加载一个10mb的XML文档,并且他们几乎同时加载,那么您就可以看到数据方面的开销是多少。但是,如果是同一个XML文档,只加载一次。实际上,如果可能的话,应该缓存转换或处理的结果。

Xslt处理基本上是轻量级的。当xslt使用外部函数或严重递归,产生大型输出文档时,情况并非如此。

然而,有时候,DOM风格的处理比xslt容易得多,因为你可以更简单地传递变量,可以使用。net BCL函数等进行更多的处理。在这种情况下,使用XMLDocument和c#代码是值得的,因为它更简单。

所以这确实取决于。

记住,如果你怀疑某件事效率不高,那么尝试它然后分析它总是值得的。这将帮助你计算出真正的成本是多少。有时候,这是决定某事是否是"最佳"方法的唯一方法。