2012-12-03 21 views
7

Ich habe einen Datensatz, die ich Rekursion in SQL erstellt mit,XML Erstellen einer hierarchischen Datensatz in 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 

Jetzt möchte ich eine XML erzeugen, die wie folgt aussehen sollte: -

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

ich mag ein hierarchisches XML mit der Eltern-Kind-Beziehung von einem Datensatz erstellen.

+2

Suchen Sie in allgemeinen Tabellenausdrücken. http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx – BenCr

+1

Wenn Sie SQL Server gespeicherte Prozeduren verwenden könnten Sie auch FOR XML EXPLICIT unter Verwendung von XML direkt aus dem Verfahren zurückkehren (http://msdn.microsoft.com/en-us/library/ms189068.aspx – bUKaneer

+0

öffentliche Klasse Person {Liste Personen {get; set;}} –

Antwort

1

Ich glaube, Sie folgenden Code verwenden könnte:

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

Ich denke, es kann mit rekursiven LINQ getan werden, aber ich muss noch herausfinden, wie es richtig zu schreiben, so ist hier eine Lösung mit rekursive Methode:

Zuerst erklären Sie Methode (ich getan habe Suche nach Name, aber Sie können es auch mit 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) 
        ); 
} 

Dann Sie es mit Ihren Eltern-Element nennen (ich habe eine obere Reihe, sonst hinzugefügt Abfrage komplizierter sein wird):

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

Jetzt haben Sie IEnumerable<XElement> es in Zeichenfolge zu drehen, können Sie folgendermaßen vor:

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

Sie Datarelation auf in-Datensatz erstellen , ZB

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

Die Attribution "Nested" ist sehr wichtig!

Makeyuan

Verwandte Themen