Dot-Net

用 XmlDocuments、XSLT 或 Linq 解析 Xml、XPath 更有效的是什麼?

  • October 8, 2008

我已經使用以下兩種方法解析了 XML…

  • 使用對像模型和 XPath 查詢解析 XmlDocument。
  • XSL/T

但是我從來沒用過…

  • .Net 3.5 新增的 Linq Xml 對像模型

誰能告訴我這三種選擇之間的比較效率?

我意識到特定的用法會是一個因素,但我只是想要一個粗略的想法。例如,Linq 選項是否比其他選項慢很多?

查詢 XML 文件的絕對最快方法是最難的:編寫一個使用 XmlReader 處理輸入流的方法,並讓它在讀取節點時對其進行處理。這是將解析和查詢組合到單個操作中的方法。(僅僅使用 XPath 不會這樣做;XmlDocument 和 XPathDocument 都在它們的 Load 方法中解析文件。)如果您正在處理非常大的 XML 數據流,這通常是一個好主意。

您描述的所有三種方法的執行方式都相似。XSLT 有很多空間可以成為最慢的,因為它可以讓您將 XPath 的低效率與模板匹配的低效率結合起來。XPath 和 LINQ 查詢基本上都做同樣的事情,即通過 XML 節點的可枚舉列表進行線性搜尋。我希望 LINQ 在實踐中稍微快一些,因為 XPath 在執行時解釋,而 LINQ 在編譯時解釋。

但總的來說,您編寫查詢的方式對執行速度的影響要比您使用的技術大得多。

無論您使用 XPath 還是 LINQ,針對 XML 文件編寫快速查詢的方法都是相同的:制定查詢,以便在執行期間訪問盡可能少的節點。使用哪種技術並不重要:檢查文件中每個節點的查詢將比僅檢查其中一小部分節點的查詢執行得慢得多。您這樣做的能力比其他任何事情都更依賴於 XML 的結構:具有可導航元素層次結構的文件通常比其元素都是文件元素的子元素的文件要快得多。

編輯:

雖然我很確定我是對的,查詢 XML 的絕對最快方法是最難的,但真正最快(也是最難)的方法不使用XmlReader; 它使用狀態機直接處理來自流的字元。就像用正則表達式解析 XML 一樣,這通常是一個糟糕的主意。但它確實為您提供了以速度交換功能的選項。通過決定不處理您的應用程序不需要的那些 XML 片段(例如名稱空間解析、字元實體的擴展等),您可以建構一些比搜尋更快的字元流的東西XmlReader。我可以想到這甚至不是一個壞主意的應用程序,儘管我想不出很多。

引用自:https://stackoverflow.com/questions/182976