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

C# XML 檔案轉 DataSet:XmlDocument + XmlTextReader 完整實作

     編輯:關於C#

核心方法

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();
    }
}

替代方案:DataSet.ReadXml 直接讀檔 (更簡潔)

public static DataSet ReadXmlDirect(string xmlFilePath)
{
    var ds = new DataSet();
    ds.ReadXml(xmlFilePath); // 內部自動處理 XmlReader
    return ds;
}

進階:指定讀取模式 (ReadXmlMode)

var ds = new DataSet();
ds.ReadXml(xmlFilePath, XmlReadMode.ReadSchema); // 讀取內嵌 XSD 結構描述
// XmlReadMode 傳值:
// Auto (預設) - 自動推斷
// ReadSchema - 讀取內嵌 schema
// IgnoreSchema - 忽略 schema
// InferSchema - 推斷 schema (無內嵌時)
// Fragment - 讀取 XML 片段

XML 結構對應 DataSet 規則

  • 最外層元素 → DataSet
  • 第二層重複元素 → DataTable (TableName = 元素名)
  • 第三層元素/屬性 → DataColumn
  • 巢狀重複元素 → 關聯 DataTable (自動建立 DataRelation)

範例 XML 結構



  
    
    
  
  
    
    
  

轉換後:

  • DataTable `Connection`:Columns = Name, Server, Database, User, Password
  • DataTable `Item`:Columns = Key, Value, Type
  • 自動建立 `Config_Database`、`Config_Settings` 關聯

常見問題

問題原因解決
DataSet.Tables 為空XML 無重複第二層元素 (單一記錄)確保 XML 結構有重複項目,或手動定義 Schema
型別推斷錯誤全為字串,數值/日期未轉型使用 `ReadSchema` 配合內嵌 XSD,或轉換後手動 `Column.DataType = typeof(int)`
大檔案記憶體不足DataSet 全載入記憶體改用 `XmlReader` 串流逐筆處理,不載入 DataSet

參考資源

原文連結:https://www.bianceng.cn/Programming/csharp/201410/45572.htm

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