2012-12-03 41 views
7

Tôi có một Dataset mà tôi tạo bằng Đệ quy trong SQL,Tạo XML từ một Dataset thứ bậc trong C#

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 

Bây giờ tôi muốn tạo ra một XML mà nên xem xét như thế này: -

<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> 

Tôi muốn tạo một XML phân cấp bằng cách sử dụng mối quan hệ cha mẹ và con từ một tập dữ liệu.

+2

Nhìn vào biểu thức bảng chung. http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx – BenCr

+1

Nếu bạn đang sử dụng các thủ tục lưu sẵn SQL Server, bạn cũng có thể trả lại XML trực tiếp từ quy trình sử dụng FOR XML EXPLICIT (http://msdn.microsoft.com/en-us/library/ms189068.aspx – bUKaneer

+0

Lớp công khai Người {Danh sách người {get; set;}} –

Trả lời

1

Tôi nghĩ bạn có thể sử dụng đoạn mã sau:

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 

    } 
1

Tôi nghĩ rằng nó có thể được thực hiện với đệ quy LINQ, nhưng tôi vẫn cần phải tìm ra cách để viết nó đúng, vì vậy đây là một giải pháp với phương pháp đệ quy:

Đầu tiên, bạn khai báo phương pháp (tôi đã thực hiện tìm kiếm bằng Name, nhưng bạn cũng có thể làm điều đó với 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) 
        ); 
} 

Sau đó, bạn gọi nó với yếu tố cha mẹ của bạn (tôi đã thêm một dòng đầu tiên, nếu không truy vấn sẽ phức tạp hơn):

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); 

Bây giờ bạn có IEnumerable<XElement>, để biến nó thành chuỗi, bạn có thể làm sau:

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

Bạn có thể tạo DataRelation vào trong tập dữ liệu , Ví dụ:

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

Thuộc tính "Lồng nhau" là rất quan trọng!

Makeyuan