You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#结合Linq从DataTable生成指定结构的XML文件?

从DataTable生成指定结构XML的实现方法

假设你的DataTable包含以下核心列:Type(取值为ORACLE/SQL/MYSQL/SERVER)、Name(对应XML中的节点名如name1/Server1)、ConnectionString、Command。下面用C#结合XDocument实现你要的XML结构,代码逻辑清晰易读:

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

public class XmlGenerator
{
    public static XDocument GenerateXmlFromDataTable(DataTable dt)
    {
        // 初始化根节点
        var root = new XElement("Root");
        
        // 创建DB和SERVER层级节点
        var dbNode = new XElement("DB");
        var serverParentNode = new XElement("SERVER");
        var serverChildNode = new XElement("SERVER");
        serverParentNode.Add(serverChildNode);
        root.Add(dbNode, serverParentNode);

        // 按Type分组处理数据行
        var groupedRows = dt.AsEnumerable()
                            .GroupBy(row => row.Field<string>("Type"));

        foreach (var group in groupedRows)
        {
            switch (group.Key.ToUpper())
            {
                case "ORACLE":
                case "SQL":
                case "MYSQL":
                    // 创建对应数据库类型的节点
                    var dbTypeNode = new XElement(group.Key);
                    dbNode.Add(dbTypeNode);
                    // 遍历组内行生成子节点
                    foreach (var row in group)
                    {
                        var nameNode = new XElement(row.Field<string>("Name"));
                        nameNode.Add(
                            new XElement("CONNECTION_STRING", row.Field<string>("ConnectionString")),
                            new XElement("COMMAND", row.Field<string>("Command") ?? "")
                        );
                        dbTypeNode.Add(nameNode);
                    }
                    break;
                case "SERVER":
                    // 处理SERVER类型的行
                    foreach (var row in group)
                    {
                        var serverNode = new XElement(row.Field<string>("Name"));
                        serverNode.Add(
                            new XElement("CONNECTION_STRING", row.Field<string>("ConnectionString")),
                            new XElement("COMMAND", row.Field<string>("Command") ?? "")
                        );
                        serverChildNode.Add(serverNode);
                    }
                    break;
            }
        }

        return new XDocument(root);
    }

    // 调用示例
    public static void Main()
    {
        // 模拟你的DataTable数据
        DataTable dt = new DataTable();
        dt.Columns.Add("Type", typeof(string));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("ConnectionString", typeof(string));
        dt.Columns.Add("Command", typeof(string));

        dt.Rows.Add("ORACLE", "name1", "connection1", "SELECT * FROM table");
        dt.Rows.Add("ORACLE", "name2", "connection2", "SELECT * FROM table");
        dt.Rows.Add("SQL", "name4", "connection4", "SELECT 1");
        dt.Rows.Add("SERVER", "Server1", "192.168.0.1", "");
        
        var xmlDoc = GenerateXmlFromDataTable(dt);
        // 保存到文件或直接输出
        xmlDoc.Save("output.xml");
        Console.WriteLine(xmlDoc.ToString());
    }
}

关键说明

  • 用AsEnumerable()将DataTable转为可枚举集合,通过LINQ按Type分组,简化层级构建逻辑
  • 针对不同类型分支处理,严格匹配你需要的XML层级结构
  • 用?? ""处理Command为空的情况,避免生成无效空节点
  • 代码可直接运行,生成的XML结构完全符合你的示例要求

如果习惯使用传统的XmlDocument,核心逻辑一致,仅节点创建、添加的API不同,本质都是先构建层级框架,再逐行填充数据。

内容的提问来源于stack exchange,提问作者johndemanfran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:23