public static DataSet ConvertXmlFileToDataSet(string xmlFilePath)
{
if (!File.Exists(xmlFilePath))
throw new FileNotFoundException("XML 檔案不存在", xmlFilePath);
var xmlDoc = new XmlDocument();
xmlDoc.Load(xmlFilePath);
var dataSet = new DataSet();
using (var stringReader = new StringReader(xmlDoc.InnerXml))
using (var xmlReader = new XmlTextReader(stringReader))
{
dataSet.ReadXml(xmlReader);
}
return dataSet;
}
string configPath = GetAbsolutePath(@"Config\settings.xml"); // 參考前一文取得路徑
DataSet ds = ConvertXmlFileToDataSet(configPath);
foreach (DataTable table in ds.Tables)
{
Console.WriteLine($"Table: {table.TableName}, Rows: {table.Rows.Count}");
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
Console.Write($"{col.ColumnName}={row[col]} ");
Console.WriteLine();
}
}
public static DataSet ReadXmlDirect(string xmlFilePath)
{
var ds = new DataSet();
ds.ReadXml(xmlFilePath); // 內部自動處理 XmlReader
return ds;
}
var ds = new DataSet();
ds.ReadXml(xmlFilePath, XmlReadMode.ReadSchema); // 讀取內嵌 XSD 結構描述
// XmlReadMode 傳值:
// Auto (預設) - 自動推斷
// ReadSchema - 讀取內嵌 schema
// IgnoreSchema - 忽略 schema
// InferSchema - 推斷 schema (無內嵌時)
// Fragment - 讀取 XML 片段
轉換後:
| 問題 | 原因 | 解決 |
|---|---|---|
| DataSet.Tables 為空 | XML 無重複第二層元素 (單一記錄) | 確保 XML 結構有重複項目,或手動定義 Schema |
| 型別推斷錯誤 | 全為字串,數值/日期未轉型 | 使用 `ReadSchema` 配合內嵌 XSD,或轉換後手動 `Column.DataType = typeof(int)` |
| 大檔案記憶體不足 | DataSet 全載入記憶體 | 改用 `XmlReader` 串流逐筆處理,不載入 DataSet |
原文連結:https://www.bianceng.cn/Programming/csharp/201410/45572.htm