2013-05-27 72 views
-1

是否可以使用C#獲取以下XML文件。數據在SQL Server中。使用C#生成以下XML文件

<Person HomeID="1"> 
    <Day ID="1"> 
    <String>I get up at 07:00</String> 
    <String>I have breakfast at 07:30</String> 
    <String>I go to office at 08:00</String> 
    <String>I have lunch at 13:00</String> 
    <String>I come back from office at 17:00</String> 
    <String>I have dinner at 19:00</String> 
    <String>I sleep at 21:30</String> 
    </Day> 
    <Day ID="2"> 
    <String>I get up at 08:00</String> 
    <String>I have breakfast at 08:30</String> 
    <String>I have lunch at 13:00</String> 
    <String>I have dinner at 20:00</String> 
    <String>I sleep at 23:00</String> 
    </Day> 
</Person> 
<Person HomeID="2"> 
    <Day ID="1"> 
    <String>I get up at 08:00</String> 
    <String>I have breakfast at 08:30</String> 
    <String>I go to office at 09:00</String> 
    <String>I have lunch at 13:00</String> 
    <String>I come back from office at 18:00</String> 
    <String>I have dinner at 20:00</String> 
    <String>I sleep at 22:00</String> 
    </Day> 
    <Day ID="2"> 
    <String>I get up at 09:00</String> 
    <String>I have breakfast at 10:00</String> 
    <String>I have lunch at 13:00</String> 
    <String>I have dinner at 19:00</String> 
    <String>I sleep at 22:30</String> 
    </Day> 
</Person> 

我有兩個表,TB1和TB2。

TB1中的字段是HomeID,DayID,TimeCode,timevalue。

HomeID DayID TimeCode timevalue 
    1  1  1   07:00:00 
    1  1  2   07:30:00 
    1  1  3   08:00:00 
    1  1  4   13:00:00 
    1  1  5   17:00:00 
    1  1  6   19:00:00 
    1  1  7   21:30:00 
    1  2  1   08:00:00 
    1  2  2   08:30:00 
    1  2  3   13:00:00 
    1  2  4   20:00:00 
    1  2  5   23:00:00 
    2  1  1   08:00:00 
    2  1  2   08:30:00 
    2  1  3   09:00:00 
    2  1  4   13:00:00 
    2  1  5   18:00:00 
    2  1  6   20:00:00 
    2  1  7   22:00:00 
    2  2  1   09:00:00 
    2  2  2   10:00:00 
    2  2  3   13:00:00 
    2  2  4   19:00:00 
    2  2  5   22:30:00 

TB2中的字段是DayType,StringCode,RndString。

DayType  StringCode RndString 
    1  1   I get up at 
    1  2   I have breakfast at 
    1  3   I go to office at 
    1  4   I have lunch at 
    1  5   I come back from office at 
    1  6   I have dinner at 
    1  7   I sleep at 
    2  1   I get up at 
    2  2   I have breakfast at 
    2  3   I have lunch at 
    2  4   I have dinner at 
    2  5   I sleep at 

注: TB1.DayID = TB2.DayType和TB1.TimeCode = TB2.StringCode

等效SQL查詢來產生期望的XML輸出是

select T1_1.HomeID as [@HomeID], 
     (
     select T1_2.DayID as [@ID], 
       (
       select T2.RndString+' '+left(T1_3.TimeValue, 5) as '*' 
       from TB1 as T1_3 
       inner join TB2 as T2 
        on T1_3.DayID = T2.DayType and 
        T1_3.TimeCode = T2.StringCode 
       where T1_2.HomeID = T1_3.HomeID and 
        T1_2.DayID = T1_3.DayID 
       order by T2.StringCode 
       for xml path('String'), type 
      ) 
     from TB1 as T1_2 
     where T1_2.HomeID = T1_1.HomeID 
     group by T1_2.DayID, 
       T1_2.HomeID 
     order by T1_2.DayID 
     for xml path('Day'), type 
     ) 
from TB1 as T1_1 
group by T1_1.HomeID 
order by T1_1.HomeID 
for xml path('Person') 

我試用解決方案。

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows.Forms; 
    using System.Text; 
    using System.Data; 
    using System.Data.SqlClient; 

    namespace SQL 
    { 
     static class Program 
     { 
      // To generate XML File using C# from SQL Server Data 

      // The main entry point for the application. 
      [STAThread] 
      static void Main() 
      { 
       // Create a String to hold the database connection string. 
       string sdwConnectionString = @"Data Source=IE1ADTBD5ZL1S\;Initial Catalog=RecommendEngine;Integrated Security=True"; 

       // Create a connection 
       SqlConnection sdwDBConnection = new SqlConnection(sdwConnectionString); 

       // Open the connection 
       sdwDBConnection.Open(); 



       //Create a String to hold the query. 
       string query = @"select T1_1.HomeID as [@HomeID], 
                (
                 select T1_2.DayID as [@ID], 
                   (
                   select T2.RndString+' '+left(T1_3.TimeValue, 5) as '*' 
                   from TB1 as T1_3 
                   inner join TB2 as T2 
                    on T1_3.DayID = T2.DayType and 
                     T1_3.TimeCode = T2.StringCode 
                   where T1_2.HomeID = T1_3.HomeID and 
                    T1_2.DayID = T1_3.DayID 
                   order by T2.StringCode 
                   for xml path('String'), type 
                  ) 
                 from TB1 as T1_2 
                 where T1_2.HomeID = T1_1.HomeID 
                 group by T1_2.DayID, 
                   T1_2.HomeID 
                 order by T1_2.DayID 
                 for xml path('Day'), type 
                ) 
                from TB1 as T1_1 
                group by T1_1.HomeID 
                order by T1_1.HomeID 
                for xml path('Person'), root('Persons')"; 

       //Create a SqlCommand object and pass the constructor the connection string and the query string. 
       SqlCommand queryCommand = new SqlCommand(query, sdwDBConnection); 

       DataTable dt = new DataTable(); 
       new SqlDataAdapter(queryCommand).Fill(dt); 
       dt.TableName = "TableName"; 
       dt.WriteXml(@"C:/SampleFile.xml"); 


       // Close the connection 
       sdwDBConnection.Close(); 

      } 
     } 
    } 
+0

-1,不顯示任何努力,自己嘗試一下。 –

+0

嘿,我確實試圖解決這個問題。但它沒有得到有效發揮。 – SarangArd

回答

0

你想從數據創建XML,對吧?如果是這樣,這將讓你開始

public XDocument CreateXML(string[][] activities) 
    { 
     int HomeID = 1; 
     XDocument doc = new XDocument(); 
     doc.Add(new XAttribute("HomeID", ""+HomeID++); 

     foreach (string[] dayactivities in activities) 
     { 
      int ID=1; 
      XElement day = new XElement("Day"); 
      day.Add(new XAttribute("ID", ""+ID++)); 
      doc.Add(day); 

      foreach (string s in dayactivities) 
       day.Add(new XElement("String", s)); 
     } 

     return doc; 
    } 
1

嘗試這一個 -

模式:

SET NOCOUNT ON; 

DECLARE @TB1 TABLE 
(
     HomeID INT 
     , DayID INT 
     , TimeCode INT 
     , timevalue CHAR(10) 
) 

INSERT INTO @TB1 (HomeID, DayID, TimeCode, timevalue) 
VALUES 
    (1, 1, 1, '07:00:00'), (1, 1, 2, '07:30:00'), 
    (1, 1, 3, '08:00:00'), (1, 1, 4, '13:00:00'), 
    (1, 1, 5, '17:00:00'), (1, 1, 6, '19:00:00'), 
    (1, 1, 7, '21:30:00'), (1, 2, 1, '08:00:00'), 
    (1, 2, 2, '08:30:00'), (1, 2, 3, '13:00:00'), 
    (1, 2, 4, '20:00:00'), (1, 2, 5, '23:00:00'), 
    (2, 1, 1, '08:00:00'), (2, 1, 2, '08:30:00'), 
    (2, 1, 3, '09:00:00'), (2, 1, 4, '13:00:00'), 
    (2, 1, 5, '18:00:00'), (2, 1, 6, '20:00:00'), 
    (2, 1, 7, '22:00:00'), (2, 2, 1, '09:00:00'), 
    (2, 2, 2, '10:00:00'), (2, 2, 3, '13:00:00'), 
    (2, 2, 4, '19:00:00'), (2, 2, 5, '22:30:00') 

DECLARE @TB2 TABLE 
(
     DayType INT 
     , StringCode INT 
     , RndString VARCHAR(50) 
) 

INSERT INTO @TB2 (DayType, StringCode, RndString) 
VALUES 
    (1, 1, 'I get up at '), 
    (1, 2, 'I have breakfast at '), 
    (1, 3, 'I go to office at '), 
    (1, 4, 'I have lunch at '), 
    (1, 5, 'I come back from office at '), 
    (1, 6, 'I have dinner at '), 
    (1, 7, 'I sleep at '), 
    (2, 1, 'I get up at '), 
    (2, 2, 'I have breakfast at '), 
    (2, 3, 'I have lunch at '), 
    (2, 4, 'I have dinner at '), 
    (2, 5, 'I sleep at ') 

例1:

SELECT 
     '@HomeID' = t.HomeID 
    , (
      SELECT '@ID' = t2_.DayID 
       , (
        SELECT t4.RndString + LEFT(t3.TimeValue, 5) 
        FROM @TB1 t3 
        JOIN @TB2 t4 ON t3.DayID = t4.DayType AND t3.TimeCode = t4.StringCode 
        WHERE t2_.DayID = t3.DayID 
         AND t.HomeID = t3.HomeID 
        FOR XML PATH ('String'), TYPE 
       ) 
      FROM (
       SELECT DISTINCT t2.DayID 
       FROM @TB1 t2 
       WHERE t.HomeID = t2.HomeID 
      ) t2_ 
      FOR XML PATH ('Day'), TYPE 
     ) 
FROM (
    SELECT DISTINCT T1.HomeID 
    FROM @TB1 T1 
) t 
FOR XML PATH ('Person'), TYPE 

例2:

SELECT 
     Person.HomeID 
     , ID = [Day].DayID 
     , String.String 
FROM @TB1 Person 
JOIN (
    SELECT T1.HomeID, T1.DayID 
    FROM @TB1 T1  
) [Day] on Person.HomeID = [Day].HomeID 
JOIN (
    SELECT 
      String = t4.RndString + LEFT(t3.TimeValue, 5) 
     , t3.DayID 
     , t3.HomeID 
    FROM @TB1 t3 
    JOIN @TB2 t4 ON t3.DayID = t4.DayType AND t3.TimeCode = t4.StringCode 
) String ON [Day].DayID = String.DayID AND [Day].HomeID = String.HomeID 
GROUP BY Person.HomeID, [Day].DayID, String 
FOR XML AUTO 

輸出:

<Person HomeID="1"> 
    <Day ID="1"> 
    <String>I get up at 07:00</String> 
    <String>I have breakfast at 07:30</String> 
    <String>I go to office at 08:00</String> 
    <String>I have lunch at 13:00</String> 
    <String>I come back from office at 17:00</String> 
    <String>I have dinner at 19:00</String> 
    <String>I sleep at 21:30</String> 
    </Day> 
    <Day ID="2"> 
    <String>I get up at 08:00</String> 
    <String>I have breakfast at 08:30</String> 
    <String>I have lunch at 13:00</String> 
    <String>I have dinner at 20:00</String> 
    <String>I sleep at 23:00</String> 
    </Day> 
</Person> 
<Person HomeID="2"> 
    <Day ID="1"> 
    <String>I get up at 08:00</String> 
    <String>I have breakfast at 08:30</String> 
    <String>I go to office at 09:00</String> 
    <String>I have lunch at 13:00</String> 
    <String>I come back from office at 18:00</String> 
    <String>I have dinner at 20:00</String> 
    <String>I sleep at 22:00</String> 
    </Day> 
    <Day ID="2"> 
    <String>I get up at 09:00</String> 
    <String>I have breakfast at 10:00</String> 
    <String>I have lunch at 13:00</String> 
    <String>I have dinner at 19:00</String> 
    <String>I sleep at 22:30</String> 
    </Day> 
</Person> 
+0

請嘗試更新的答案。 – Devart