從遠端 URL 讀取並解析 XML 是常見需求。.NET 提供兩種風格迥異的 API:LINQ to XML(記憶體樹狀、查詢導向)與 XmlReader(流式、前向唯讀、低記憶體)。依據檔案大小與效能需求選擇。
適用於中小型 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。
適用於大型 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 XML | XmlReader |
|---|---|---|
| 記憶體模型 | DOM 樹狀 | 游標流式 |
| 檔案大小建議 | < 10 MB | 無上限 |
| 查詢靈活度 | 高(LINQ) | 低(手寫狀態機) |
| 非同步支援 | .NET 6+ LoadAsync | 原生 ReadAsync |
| 命名空間處理 | 內建 XNamespace | 手動 LookupNamespace |
XmlReader 定位片段,再用 XElement.ReadFrom(reader) 將片段物件化查詢。XNamespace ns = "urn:example"; doc.Descendants(ns + "Item") 避免查無結果。try-catch 處理 WebException、XmlException,並設定逾時。