首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 讀取網路 XML 兩大經典做法:LINQ to XML 與 XmlReader

     編輯:關於C#

從遠端 URL 讀取並解析 XML 是常見需求。.NET 提供兩種風格迥異的 API:LINQ to XML(記憶體樹狀、查詢導向)與 XmlReader(流式、前向唯讀、低記憶體)。依據檔案大小與效能需求選擇。

方案一:LINQ to XML — 直覺、強型別查詢

適用於中小型 XML(< 10MB),一次載入記憶體,支援 LINQ 查詢與匿名型別投影。


using System.Xml.Linq;
using System.Xml;

public static void UseLinqToXml(string url)
{
    XDocument doc = XDocument.Load(url); // 直接支援 HTTP/HTTPS

    var query = from e in doc.Descendants()
                where e.NodeType == XmlNodeType.Element
                select new
                {
                    Name = e.Name.LocalName,
                    Value = e.Value
                };

    foreach (var item in query)
    {
        Console.WriteLine($"{item.Name} -> {item.Value}");
        // Web 環境可改寫入 Response
    }
}

優點:語法簡潔、支援複雜查詢、可直接序列化為物件。
缺點:整份文件載入記憶體,大檔案易造成 OOM。

方案二:XmlReader — 流式處理、恆定記憶體

適用於大型 XML、串流處理、低記憶體環境。XmlReader.Create 內建 XmlUrlResolver 自動解析遠端 URL。


using System.Xml;

public static void UseXmlReader(string url)
{
    var settings = new XmlReaderSettings
    {
        Async = true,           // .NET Core / 5+ 支援非同步
        IgnoreWhitespace = true // 跳過空白節點
    };

    using (XmlReader reader = XmlReader.Create(url, settings))
    {
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    Console.WriteLine($"Element: {reader.Name}");
                    break;
                case XmlNodeType.Text:
                case XmlNodeType.CDATA:
                    Console.WriteLine($"Value: {reader.Value}");
                    break;
                // 可擴充處理 Attribute、Comment 等
            }
        }
    }
}

優點:記憶體占用極低、支援非同步、可處理 GB 級 XML。
缺點:程式碼較繁瑣、無法隨機存取、需自行維護狀態。

效能與選型指南

指標LINQ to XMLXmlReader
記憶體模型DOM 樹狀游標流式
檔案大小建議< 10 MB無上限
查詢靈活度高(LINQ)低(手寫狀態機)
非同步支援.NET 6+ LoadAsync原生 ReadAsync
命名空間處理內建 XNamespace手動 LookupNamespace

進階提示

  • 混合策略:大檔案先用 XmlReader 定位片段,再用 XElement.ReadFrom(reader) 將片段物件化查詢。
  • 命名空間:LINQ 查詢時務必使用 XNamespace ns = "urn:example"; doc.Descendants(ns + "Item") 避免查無結果。
  • 錯誤處理:網路呼叫務必包裝 try-catch 處理 WebException、XmlException,並設定逾時。

完整範例下載

本文配套原始碼(含非同步版本與單元測試)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved