【问题标题】:Advantages of XSLT or Linq to XMLXSLT 或 Linq to XML 的优势
【发布时间】:2009-06-30 22:13:52
【问题描述】:

在 C# 中使用 XSLT 或 Linq to XML 进行 HTML 解析有什么优势?这是假设 html 已被清理,因此它是有效的 xhtml。这些值最终会进入一个 c# 对象进行验证和处理。

请让我知道这些是否有效以及是否还有其他需要考虑的事项。

XSLT 优势:

  • 易于快速更改和部署
  • 相当有名

XSLT 缺点:

  • 未编译,因此处理速度较慢
  • 字符串操作可能很麻烦
  • 最后进入 C# 对象将更具挑战性

Linq to XML 优点:

  • 已编译,因此运行速度更快
  • 允许更好的字符串操作

Linq to XML 的缺点:

  • 必须编译更新

编辑: 我应该澄清一下,我希望这些能够长期运行,并且网站可能会不时更新它们的布局。这是我认为我会使用不需要编译的东西的更大原因之一。

【问题讨论】:

  • Visual Studio 带来了 xsltc.exe(不确定它是否已包含在标准版中),允许您从 XSLT 编译程序集(中间语言中的 dll)。因此,XSLT 在运行时编译不一定会受到惩罚。
  • XSLT 在我看来调试起来很痛苦。 Linq to XML 更易于调试......如果你分解你的链式语句。
  • @Frank:您是否检查过 VS 2008 的 XSLT 调试器(或其他 XSLT IDE 之一,如 Oxygen 或 Altova XMLSpy)?它们让您可以单步执行 XSL 转换,就像单步执行 C# 或 Java 代码一样。
  • @Frank:尝试 IronXslt 作为 XSLT 调试器,正如@0xA3 指出的那样,它是 vs2008 的插件

标签: c# xslt linq-to-xml html-parsing


【解决方案1】:

根据我的经验,当您主要处理重新排列和选择现有 xml 元素时,XSLT 更加简洁易读。 XPath 简短易懂,xml 语法避免了在代码中乱扔XElementXAttribute 语句。 XSLT 可以作为 xml-tree transform 语言正常工作。

但是,它的字符串处理很差,循环不直观,并且没有有意义的子例程概念 - 你不能转换另一个转换的输出。

所以,如果你想真正地摆弄元素和属性内容,那么它很快就会失败。顺便说一句,使用两者都没有问题 - XSLT 规范化结构(例如,确保所有 table 元素都有 tbody 元素),并使用 linq-to-xml 来解释它。优先条件匹配的可能性意味着 XSLT 在处理许多相似但不同的匹配时更容易使用。 Xslt 擅长文档简化,但它缺少太多的基本功能,无法单独使用。

我全心全意地加入了 Linq-to-Xml 的潮流,我想说它与乍一看可能看起来的 XSLT 重叠较少。 (而且我非常希望看到针对 .NET 的 XSLT 2.0/XQuery 1.0 实现)。

在性能方面,这两种技术都很快。事实上,由于很难表达缓慢的操作,您不太可能在 XSLT 中意外触发一个缓慢的情况(除非您开始使用递归......)。相比之下,LINQ to Xml 的强大功能也会使其变慢:只需在某个内部循环中使用任何重量级的 .NET 对象,就会出现性能问题。

无论您做什么,都不要试图通过使用 XSLT 来执行除最简单逻辑之外的任何操作来滥用 XSLT:它比等效的 C# 更冗长且可读性差得多。如果您需要一堆逻辑(即使像 date > DateTime.Now ? "will be" : "has" 这样简单的东西在 XSLT 中也会变得臃肿不堪)并且您不想同时使用 XSLT 和 Linq to Xml,请使用 Linq。

【讨论】:

    【解决方案2】:

    在不进一步了解您的用例的情况下,很难为您提供一般性建议。

    不管怎样,你在比较苹果和橘子。 LINQ to XML(和一般的 LINQ)是一种查询语言,而 XSLT 是一种用于转换 XML 树结构的编程语言。这些是不同的概念。每当您想从数据源中提取特定的特定信息以执行您需要对其执行的任何操作(例如在 C# 对象中设置字段)时,您都可以使用查询语言。相反,转换有助于将数据的一种 XML 表示形式转换为另一种 XML 表示形式。

    因此,如果您的目标是从 XML 创建 C# 对象,您可能不想使用 XSLT,而是使用 .NET Framework 提供的任何其他技术来处理 XML 数据:旧的XmlDocumentXmlReaderXPathDocumentXmlSerializerXDocument。每个都有其特殊的优点和缺点,具体取决于输入大小、输入复杂性、所需输出等。

    由于您只处理 HTML,您可能还想查看 CodePlex 上的 HTML Agility Pack

    【讨论】:

    • 谢谢,我一直在使用敏捷包。其中一个示例使用了 XSLT,这使我对其进行了更多研究。
    • LINQ 可能是一种查询语言,但据我了解,微软推迟在 .net 中实现 XLST 2 支持,因为他们想“鼓励”人们改用 linq
    【解决方案3】:

    由于您将使用 C#,因此在某些时候您的数据将通过 Linq(或其他用于 .NET 的 XML 代码),您不妨将其全部保留在那里。

    除非您有一些令人信服的理由来使用 XSLT,例如您已经拥有丰富的经验或部署强烈支持推出文本文件,否则请将其全部保存在一个位置。

    【讨论】:

      【解决方案4】:

      如果您只是尝试解析 HTML,则不应使用 either。 HTML != XML 并且不能被同等对待。例如转义序列 ' '在 HTML 中完全有效,但不是有效 XML 文档中的有效实体(没有严重的 DTD 等问题)。这会咬你的,相信我!

      我还建议使用 HTML Agility pack - 出色的库。

      【讨论】:

      • 这已经被推荐了。我忘了提到我已经在使用那个包了。
      【解决方案5】:

      HTML 敏捷包?

      让我试试。

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多