2012-12-03 29 views
7

मैं एक डेटासेट जो मैं एसक्यूएल में Recursion उपयोग करके बनाया जातासी # में एक पदानुक्रमित डेटासेट से XML बनाएं

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 

अब मैं एक एक्सएमएल जो इस तरह दिखना चाहिए उत्पन्न करने के लिए करना चाहते हैं: -

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

मैं डेटासेट से अभिभावक और बाल संबंध का उपयोग कर एक पदानुक्रमित XML बनाना चाहता हूं।

+2

सामान्य तालिका अभिव्यक्तियों को देखें। http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx – BenCr

+1

यदि आप SQL सर्वर संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं तो आप XML एक्सप्लोरिट के लिए प्रक्रिया से सीधे एक्सएमएल वापस कर सकते हैं (http://msdn.microsoft.com/en-us/library/ms189068.aspx – bUKaneer

+0

पब्लिक क्लास व्यक्ति {सूची व्यक्तियों {get; set;}} –

उत्तर

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 

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