我有一个关于使用.NET框架在C#中设置XML样式的问题。我正在开发一个网站,其中99%的数据存储为XML。很多时候,我坚持要么使用XSLT来转换这个XML,要么将XML读入XMLDocument数据类型,使用XPATH解析它,并基本上将输出附加到整个页面的Literal服务器控件来处理显示。 我觉得后者在内存方面要贵得多,因为我正在将XML读入数据类型并使用foreach语句和其他逻辑语句循环遍历节点。我通常这样做的唯一原因是因为我更喜欢这样做,而且因为我绝不是XSL大师,所以这是我完成我需要做的唯一方法。 我想我想知道是否有人知道这样做有多强更多昂贵?除了我正在解析的xml的大小之外,哪些因素可能会影响。先感谢您。
答案 0 :(得分:4)
之前已经证明,在Jon Bentley's classic book中,在Assembler中实现的错误算法执行速度比在Basic 中实现的好算法慢几千倍。
因此,说“技术A比技术B 更快”是完全错误的。
至于消耗的内存,它在很大程度上取决于XML文档的大小。 XmlDocument和典型的XSLT 1.0或2.0处理器都在内存中构建了一个完整的XML文档的表示,因此在两种情况下使用多GB的XML文档都存在问题。
XSLT 3.0(仍处于工作草案状态)有streaming feature ,允许以流模式处理XML文档,前提是转换中使用的XPath表达式遵循某些限制。
我认为考虑一组指标与仅一个指标是有用的。
XSLT是专为处理树结构而设计的语言,因此它提供了其他语言中不存在的有价值的功能。两个示例是 templates 和模式匹配。
使用模板和模式匹配,可以声明性地表达转换。代码更简单,更简单,更易于理解和维护,可扩展。编写XSLT代码通常可以在几分钟内完成,而编程过程中使用的是类似spagheti的代码。
由于变量是不可变的,因此用函数式语言调试程序甚至是正确性证明也更容易。
由于同样的原因,XSLT处理器进行非常积极的优化的可能性更大。
最后,让我反驳一下在@dash:
的其他好答案中所作的陈述xslt可以有效地输出HTML。
另一方面,特别是2,你会失去很多 asp.net可以提供的强大功能,从Web表单到 MVC。鉴于您最终想要填充asp.net服务器 控制,你这样做的方式很好,否则你就是这样 运行xslt只是为了获取值
实际上,有一种编写XSLT的方式,内容和处理之间存在严格而清晰的分离(我称之为填充空白模式)。
例如,请参阅我的回答 to this question 。
使用此方法开发XSLT应用程序有以下优点:
此代码可以使用来自任何数据文档的数据(再次作为外部参数传递的路径)填充任何渲染文档(作为外部参数传递的路径)。因此,可以创建填充不同数据的不同输出/格式。
要替换为“实时内容”的占位符(gen:data
元素)可以具有不同的格式和语义 - 对一个人的想象力没有限制。
编辑(非XSLT专家)可以相互独立地处理一个或多个渲染文档,也可以从XSLT开发人员处理。
实现了更高程度的可重用性,灵活性和可维护性。
总结:尽管可能,使用基于DOM的过程语言转换XML的方法在开发资源方面成本更高,并且在代码复杂性,可理解性方面导致质量较差,可维护性和可扩展性。
答案 1 :(得分:3)
Xslt在同一个校长上工作;它将它加载到DOM中(尽管通常不是XmlDocument - 有一个更轻量级的只读模型可用 - XPathDocument),并执行xpath表达式(最终,在节点上循环)。
写得不好xslt可能很慢,写得不好c#可能很慢。要知道哪个更快,你需要分析,注意也可以简单地改进你当前的代码(无论哪个)。
答案 2 :(得分:2)
除了Marc的回答之外,还有其他一些事情需要考虑;
可以独立于重新编译代码来编辑xslt文件。我在一个类似于你所描述的系统上工作,并且能够独立于改变代码来部署转换是有用的;必须重新编译和重新部署所有二进制文件比部署单个xslt更困难。
Xslt to 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#代码是值得的,因为它是简单。
所以它确实依赖。
请记住,如果您怀疑它效率不高,那么总是值得尝试一下然后对其进行分析。这将帮助您确定实际成本。有时这是决定某些东西是否“最佳”方式的唯一方法。