如何用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
相关产品推荐
相关产品推荐

