简体   繁体   English

在C#中将DataTable转换为XML层次结构

[英]Convert DataTable into XML hierarchy in C#

I have the following DataTable: 我有以下数据表:

A   B   C
----------
A1  B1  C1
A1  B1  C2
A1  B1  C3
A1  B2  C1
A1  B2  C2
----------

I tried to convert it using C# to be in XML format like this: 我试图使用C#将其转换为XML格式,如下所示:

<Data>
    <A>
        <lable>A1</lable>
        <B>
            <lable>B1</lable>
            <C>
                <lable>C1</lable>
                <lable>C2</lable>
                <lable>C3</lable>
            </C>
            <lable>B2</lable>
            <C>
                <lable>C1</lable>
                <lable>C2</lable>
            </C>
        </B>
    </A>
</Data>

I did a deep search and I found something helpful online like this . 我做了深刻的搜索,我发现有用的东西在网上像这样 But that one uses relations, and my data is just one table. 但是那个使用关系,而我的数据只是一张表。 I also tried this C# code: 我也尝试过此C#代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Xml.Linq;
    using System.Data.SqlClient;

    SqlConnection con = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Files;Data Source=localhost");
    con.Open();
    SqlCommand cmd = new SqlCommand("select * from MyTable",con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable DT = new DataTable("Data");
    da.Fill(DT);
    dataGridView1.DataSource = DT;
    con.Close();
    string XML = ToXmlFormat(DT, 0);
    Console.WriteLine(XML);


public string ToXmlFormat(this DataTable table, int metaIndex = 0)
{
    XDocument xdoc = new XDocument(
        new XElement(table.TableName,
            from column in table.Columns.Cast<DataColumn>()
            where column != table.Columns[metaIndex]
            select new XElement(column.ColumnName,
                from row in table.AsEnumerable()
                select new XElement(row.Field<string>(metaIndex), row[column])
                )
            )
        );

    return xdoc.ToString();
}

The result was another format which is not nested XML as I explained. 结果是另一种格式,该格式不是我所解释的嵌套XML。 see image 看图片

How can I convert my table into the XML format I need? 如何将表转换为所需的XML格式?

You need to use GroupBy to group the rows, then select the parts you want into XElements . 您需要使用GroupBy对行进行分组,然后将所需的部分选择为XElements
The code below should do what you want: 下面的代码应执行所需的操作:

    var xml = new XElement(table.TableName, table.Rows.Cast<DataRow>()
        .GroupBy(row => (string)row[0])
        .Select(g =>
            new XElement(table.Columns[0].ColumnName,
                new XElement("label", g.Key),
                g.GroupBy(row => (string)row[1])
                 .Select(g1 =>
                    new XElement(table.Columns[1].ColumnName,
                        new XElement("label", g1.Key),
                        new XElement(table.Columns[2].ColumnName,
                            g1.Select(row =>
                                new XElement("label", (string)row[2])
                            )
                        )
                    )
                )
            )
        )
    ).ToString();

Fiddle: https://dotnetfiddle.net/qEWNvj 小提琴: https : //dotnetfiddle.net/qEWNvj

My style is a little different from other answers. 我的风格与其他答案略有不同。 The code is tested and matches your expected results. 该代码已经过测试,符合您的预期结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("A", typeof(string));
            dt.Columns.Add("B", typeof(string));
            dt.Columns.Add("C", typeof(string));

            dt.Rows.Add(new object[] {"A1", "B1","C1"});
            dt.Rows.Add(new object[] {"A1", "B1","C2"});
            dt.Rows.Add(new object[] {"A1", "B1","C3"});
            dt.Rows.Add(new object[] {"A1", "B2","C1"});
            dt.Rows.Add(new object[] {"A1", "B2","C2"});

            dt = dt.AsEnumerable()
                .OrderBy(x => x.Field<string>("A"))
                .ThenBy(x => x.Field<string>("B"))
                .ThenBy(x => x.Field<string>("C"))
                .CopyToDataTable();

            XElement data = new XElement("Data", new XElement("A", dt.AsEnumerable()
                .GroupBy(g1 => g1.Field<string>("A")).Select(g1a =>  new object[] { 
                    new XElement("lable",(string)g1a.Key),
                    new XElement("B",
                        g1a.GroupBy(g2 => g2.Field<string>("B")).Select(g2b => new object[] {
                            new XElement("lable", (string)g2b.Key),
                            new XElement("C",
                                g2b.Select(g3c => new XElement("lable", g3c.Field<string>("C"))
                            ))}
                    ))}
            )));

        }
    }
}

转换XML <!--CDATA to DataTable C#</div--><div id="text_translate"><p> 我有 Webservice SOAP 方法,它将 Json 作为输入参数。</p><pre> //For sample string jsonString = "[{"Year":"2020","UserId":"1","Comp":"20","DeptId":"32","CategoryId":"53","ItemId":"0"}]"; string[] processString = budget.BudgetTagNet(jsonString);</pre><p> 现在“budget.BudgetTagNet(jsonString)”返回前面提到的字符串数组,并且 SOAP 响应显示以下值: <a href="https://i.stack.imgur.com/ms2hp.png" rel="nofollow noreferrer">SOAP 响应结果</a></p><p>现在我想将返回的预算数组转换为 DataTable 以进一步用于我的项目,但我做不到。 实现这一目标的最佳方法是什么。 我尝试过的方法如下所述。</p><pre> string jsonString = CommonEnum.DataTableToJSON(Table); err.Message = "Json String is: " + jsonString; err.Insert(); string[] processString = budget.BudgetTagNet(jsonString); err.Message = "Budget service data is: " + processString[1]; err.Insert(); var XMLAsString = CommonEnum.SerializeXML(processString[1]); err.Message = "Converted XML To String data is: " + JsonConvert.SerializeObject(XMLAsString); err.Insert(); dt = (DataTable) JsonConvert.DeserializeObject(XMLAsString, (typeof(DataTable))); err.Message = "DataTable data: " + JsonConvert.SerializeObject(dt); err.Insert();</pre><p> 最后插入数据库中的数据,如上述方法是:<a href="https://i.stack.imgur.com/zSY2Q.png" rel="nofollow noreferrer">插入的数据库值</a></p></div> - Convert XML <!CDATA to DataTable C#

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 C#将数据表转换为JSON层次结构 - C# Convert a Datatable into a JSON hierarchy 如何在C#中将xml转换为DataTable - how to convert xml to DataTable in C# 将XML文件转换为数据表C# - Convert XML file to datatable C# 转换XML <!--CDATA to DataTable C#</div--><div id="text_translate"><p> 我有 Webservice SOAP 方法,它将 Json 作为输入参数。</p><pre> //For sample string jsonString = "[{"Year":"2020","UserId":"1","Comp":"20","DeptId":"32","CategoryId":"53","ItemId":"0"}]"; string[] processString = budget.BudgetTagNet(jsonString);</pre><p> 现在“budget.BudgetTagNet(jsonString)”返回前面提到的字符串数组,并且 SOAP 响应显示以下值: <a href="https://i.stack.imgur.com/ms2hp.png" rel="nofollow noreferrer">SOAP 响应结果</a></p><p>现在我想将返回的预算数组转换为 DataTable 以进一步用于我的项目,但我做不到。 实现这一目标的最佳方法是什么。 我尝试过的方法如下所述。</p><pre> string jsonString = CommonEnum.DataTableToJSON(Table); err.Message = "Json String is: " + jsonString; err.Insert(); string[] processString = budget.BudgetTagNet(jsonString); err.Message = "Budget service data is: " + processString[1]; err.Insert(); var XMLAsString = CommonEnum.SerializeXML(processString[1]); err.Message = "Converted XML To String data is: " + JsonConvert.SerializeObject(XMLAsString); err.Insert(); dt = (DataTable) JsonConvert.DeserializeObject(XMLAsString, (typeof(DataTable))); err.Message = "DataTable data: " + JsonConvert.SerializeObject(dt); err.Insert();</pre><p> 最后插入数据库中的数据,如上述方法是:<a href="https://i.stack.imgur.com/zSY2Q.png" rel="nofollow noreferrer">插入的数据库值</a></p></div> - Convert XML <!CDATA to DataTable C# 使用json heirachy将层次结构序列化ac#datatable - serialise a c# datatable with a hierarchy as json heirachy 使用C#根据两个属性将XML转换为DataTable - Convert XML to DataTable according to two attributes using C# 如何在C#中将DataTable转换为XML文件? - How can I convert a DataTable to an XML file in C#? 我们可以直接在C#中将DataTable转换为XML吗? - Can we convert, DataTable to XML in C# Directly? C#读取数据表中的XML数据表 - C# read xml datatable in datatable 在XML C#中显示数据表 - Display the datatable in xml c#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM