如何用C#原生方式实现类似T-SQL FOR XML RAW模式的DataTable序列化?
问题解答
C#没有直接对应FOR XML RAW模式的原生DataTable序列化方法。DataTable.WriteXml()默认生成的是类似PATH模式的嵌套元素结构,没法直接输出属性化的XML格式。
如果要实现类似RAW的效果,你可以手动构建XML,以下是两种可行的实现方式:
方式一:使用XmlWriter手动构建
using System; using System.Data; using System.Xml; using System.IO; public static string ConvertDataTableToRawXml(DataTable dataTable, string elementName = "row") { var xmlSettings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }; using var stringWriter = new StringWriter(); using var xmlWriter = XmlWriter.Create(stringWriter, xmlSettings); foreach (DataRow row in dataTable.Rows) { xmlWriter.WriteStartElement(elementName); foreach (DataColumn column in dataTable.Columns) { xmlWriter.WriteAttributeString(column.ColumnName, row[column]?.ToString()); } xmlWriter.WriteEndElement(); } xmlWriter.Flush(); return stringWriter.ToString(); }
方式二:使用LINQ to XML简化实现
using System.Data; using System.Linq; using System.Xml.Linq; public static string ConvertDataTableToRawXmlLinq(DataTable dataTable, string elementName = "row") { var xmlElements = dataTable.Rows.Cast<DataRow>() .Select(row => new XElement(elementName, dataTable.Columns.Cast<DataColumn>() .Select(col => new XAttribute(col.ColumnName, row[col]?.ToString())))); return string.Join(System.Environment.NewLine, xmlElements); }
效果示例
假设你的DataTable数据如下:
Column_1 Column_2 -------- -------- one 1 two 2
调用上述任意方法后,会生成和FOR XML RAW一致的输出:
<row Column_1="one" Column_2="1" /> <row Column_1="two" Column_2="2" />
内容的提问来源于stack exchange,提问作者Mauricio Ortega
相关产品推荐
相关产品推荐

