将数据库中的记录转换为XML文档

因为XML的通用传输性好,在程序开发中很多地方都会用到XML文档,比如配置文件,数据传输文件,语言文件等等。一直以来觉得把数据库中的记录转换成一个XML文档对我来说很有难度,今天也是被项目的一个BUG逼急了,冷静下来并参考了同事的建议,终于完成了将数据库记录转换为XML文档的目的。

首先准备数据库Test2008,SQL脚本如下:

create table ClassCategory
(
ID int identity(1,1) not null,
Class_ID varchar(50) not null,
CreateOn datetime default getdate()
)

alter table ClassCategory
add  ClassName varchar(200)

insert into ClassCategory(Class_ID,ClassName)values('3167382','三一班');
insert into ClassCategory(Class_ID,ClassName)values('3267382','三二班');

select * from ClassCategory

Create Table ClassInfo
(
	ID int identity(1,1) not null,
	Class_ID varchar(50) not null,
	Class_Title varchar(Max) not null,
	Grade_ID varchar(50) not null,
	CreateOn datetime default getdate()
)

insert into ClassInfo(Class_ID,Class_Title,Grade_ID)values('3167382','测试数据','3167382');
insert into ClassInfo(Class_ID,Class_Title,Grade_ID)values('3267382','测试数据','3267382');
insert into ClassInfo(Class_ID,Class_Title,Grade_ID)values('3267382','测试数据','3267382');
insert into ClassInfo(Class_ID,Class_Title,Grade_ID)values('3267382','测试数据','3267382');
insert into ClassInfo(Class_ID,Class_Title,Grade_ID)values('3267382','测试数据','3267382');
insert into ClassInfo(Class_ID,Class_Title,Grade_ID)values('3267382','测试数据','3267382');
insert into ClassInfo(Class_ID,Class_Title,Grade_ID)values('3267382','测试数据','3267382');


select * from ClassInfo


Create Procedure GetClassCategory
as
begin
	select * from ClassCategory
end


create Proc GetClassInfo
as 
begin
	select * from ClassInfo
end

需要实现的效果像这样的:

22222

我封装了一个从数据库中获取数据的DAL:

  public class XMLOperatoer
    {
        private static string ConnectionString = "Server=Liszt-PC//SQLExpress;database=Test2008;uid=sa;pwd=123";
        public static  DataTable GetSecondNode()
        {
            DataTable dt = MyBlog.SqlHelper.ExecuteDataset(ConnectionString, "GetClassCategory", null).Tables[0];
            return dt;
        }

        public static  DataTable GetThreedNode()
        {
            DataTable dt = MyBlog.SqlHelper.ExecuteDataset(ConnectionString, "GetClassInfo", null).Tables[0];
            return dt;
        }
    }
 

首先需要创建一个XML文档,然后新建第二级的元素:

 XmlDocument doc = new XmlDocument();
        doc.LoadXml("
  
  ");

        DataTable dt = Liszt.DAL.XMLOperatoer.GetSecondNode();

        foreach (DataRow item in dt.Rows)
        {
            XmlElement el = doc.CreateElement("Class");
            el.SetAttribute("ID", item["ID"].ToString());
            el.SetAttribute("Class_ID", item["Class_ID"].ToString());
            el.SetAttribute("ClassName", item["ClassName"].ToString());

            //el.InnerText = item["ClassName"].ToString();
            doc.DocumentElement.AppendChild(el);
        }
        XmlNodeList nodesID = doc.SelectNodes("ClassInfo/Class//@Class_ID");

这样就创建好了第二级的元素,可以通过doc.InnerXml来查看生成的XML文档的内容。然后通过关联的Class_ID来创建第三层的元素:

  //选择含有Class_ID属性的元素
        XmlNodeList nodesID = doc.SelectNodes("ClassInfo/Class//@Class_ID");
        
        DataTable dtThreed = Liszt.DAL.XMLOperatoer.GetThreedNode();
        foreach (DataRow item in dtThreed.Rows)
        {
            for (int i = 0; i < nodesID.Count; i++)
            {
                if (((string)item["Class_ID"]) == nodesID.Item(i).Value)
                {
                    XmlElement el = doc.CreateElement("Class");
                    el.SetAttribute("ID", item["ID"].ToString());
                    el.SetAttribute("Class_ID", item["Class_ID"].ToString());
                    el.SetAttribute("Class_Title", item["Class_Title"].ToString());
                    el.SetAttribute("Grade_ID", item["Grade_ID"].ToString());
                    el.SetAttribute("CreateOn", item["CreateOn"].ToString());
                    XmlNodeList list = doc.SelectNodes("ClassInfo/Class");
                    list.Item(i).AppendChild(el);
                }
            }
        }
 

这样就创建好了第三层元素了。

最后可以来看看结果:

  
  
   
   Liszt">
    
   
   
    
    1" Class_ID="
    
    3238933" ClassName="
    
    三年级">
        
    
    
     
     1" Class_ID="
     
     3238933" Class_Title="
     
     三一班" Grade_ID="
     
     3238933" CreateOn="
     
     2011/3/29 22:47:23" />
        
     
     
      
      2" Class_ID="
      
      3238933" Class_Title="
      
      三二版" Grade_ID="
      
      3267382" CreateOn="
      
      2011/3/29 22:47:23" />
        
      
      
       
       5" Class_ID="
       
       3238933" Class_Title="
       
       三三版" Grade_ID="
       
       3267382" CreateOn="
       
       2011/3/29 22:47:23" />
    
      
      
    
      
      
       
       2" Class_ID="
       
       2267382" ClassName="
       
       二年级">
        
       
       
         3" Class_ID=" 
        2267382" Class_Title=" 
        二三班" Grade_ID=" 
        3238933" CreateOn=" 
        2011/3/29 22:47:23" /> 
        
          4" Class_ID=" 
         2267382" Class_Title=" 
         二五班" Grade_ID=" 
         3267382" CreateOn=" 
         2011/3/29 22:47:23" /> 
         
           6" Class_ID=" 
          2267382" Class_Title=" 
          二七班" Grade_ID=" 
          3238933" CreateOn=" 
          2011/3/29 22:47:23" /> 
          
            7" Class_ID=" 
           2267382" Class_Title=" 
           二九班" Grade_ID=" 
           3267382" CreateOn=" 
           2011/3/29 22:47:23" /> 
           
          
         
       
      
      
     
     
    
    
   
   
  
  

源代码下载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值