从C#中的分层数据集创建XML

时间:2012-12-03 15:45:49

标签: c# asp.net xml xml-parsing dataset

我有一个数据集,我使用SQL中的Recursion创建,

Parent        UserId   Child     Reporting_To_UserId   Depth        id
Aditya         13     Abhishek     4                   0            13
Abhishek       4      Saurabh      6                   1            16
Abhishek       4      Mohinder     8                   1            17
Mohinder       8      Mohammad     14                  2            18
Saurabh        6      Rahul        1                   2            11
Saurabh        6      Amitesh      5                   2            12

现在我想生成一个看起来像这样的XML: -

 <Person name="Aditya" User_Id="13">

    <Person name="Abhishek" User_Id="4">

           <Person name="Mohinder" User_id="8">
               <Person name="Mohammad" User_id="14"/>
           </Person>         

           <Person name="Saurabh" User_Id="6">
              <Person name="Rahul" User_Id="1"/>
              <Person name="Amitesh" User_Id="5"/>
           </Person>

     </Person>

 </Person>

我想使用数据集中的父子关系创建一个Hierarchical XML。

3 个答案:

答案 0 :(得分:1)

我认为可以使用递归LINQ来完成,但我仍然需要弄清楚如何正确编写它,所以这里是一个带递归方法的解决方案:

首先,您声明方法(我已完成Name搜索,但您也可以使用Id):

public static IEnumerable<XElement> BuildXML(string Parent, DataTable dt)
{
    string filter = string.Format("[Parent] = '{0}'", Parent);
    return from x in dt.Select(filter)
            select new XElement("Person",
                        new XAttribute("Name", x["Child"]),
                        new XAttribute("User_Id", x["Reporting_To_UserId"]),
                        BuildXML(x["Child"].ToString(), dt)
                    );
}

然后,你用你的父元素调用它(我添加了一行,否则查询会更复杂):

var dt = new DataTable();
dt.Columns.AddRange(new[] {
    new DataColumn("Parent"),
    new DataColumn("UserId"),
    new DataColumn("Child"),
    new DataColumn("Reporting_To_UserId"),
    new DataColumn("Depth"),
    new DataColumn("id")
});
dt.Rows.Add(new object[] { "", 0, "Aditya", 13, 0, 12 });
dt.Rows.Add(new object[] {"Aditya", 13, "Abhishek", 4, 0, 13});
dt.Rows.Add(new object[] { "Abhishek", 4, "Saurabh", 6, 1, 16 });
dt.Rows.Add(new object[] { "Abhishek", 13, "Mohinder", 8, 1, 17 });
dt.Rows.Add(new object[] { "Mohinder", 8, "Mohammad", 14, 2, 18 });
dt.Rows.Add(new object[] { "Saurabh", 6, "Rahul", 1, 2, 11 });
dt.Rows.Add(new object[] { "Saurabh", 6, "Amitesh", 5, 2, 12 });

var result = BuildXML("", dt);

现在你有IEnumerable<XElement>,把它变成字符串,你可以这样做:

var xml = result.
            Select(e => e.ToString()).
            Aggregate((current, next) => current + next);

答案 1 :(得分:1)

我认为您可以使用以下代码:

 protected void Page_Load(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
        string connStr = @"Data Source=MY-PC\SQLExpress;Initial Catalog=DataDB;User Id=ME;Password=YourPassword;Trusted_Connection=True;";
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            string sql = "Select MenuID, Text,Description, ParentID from UserInfo";
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.Fill(ds);
            da.Dispose();
        }
        ds.DataSetName = "UserInfos"; //You can start directly from here as you have the dataset just mantain Parent and Child ID Proper
        ds.Tables[0].TableName = "UserInfo";
        DataRelation relation = new DataRelation("ParentChild",
         ds.Tables["UserInfo"].Columns["MenuID"],
         ds.Tables["UserInfo"].Columns["ParentID"], true);

        relation.Nested = true;
        ds.Relations.Add(relation);  //XmlDataSource1 is any source of xml you can have this in file also
        XmlDataSource1.Data = ds.GetXml(); //Here Dataset will automatically generate XML for u based on relations added

    }

答案 2 :(得分:0)

您可以在数据集中创建DataRelation,例如

DataRelation relation = new DataRelation("ParentChild",
         ds.Tables["UserInfo"].Columns["MenuID"],
         ds.Tables["UserInfo"].Columns["ParentID"], true);
**relation.Nested = true;**
ds.Relations.Add(relation);  //

归属“嵌套”非常重要!

Makeyuan