是否可以使用C#获取以下XML文件。数据在SQL Server中。
<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
生成所需XML输出的等效SQL查询是
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)
试试这个 -
<强>架构:强>
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>
答案 1 :(得分: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;
}