zoukankan      html  css  js  c++  java
  • 将数据库中的记录转换为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("<ClassInfo Name=\"Liszt\"></ClassInfo>");
    
            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);
                    }
                }
            }
     

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

    最后可以来看看结果:

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

    源代码下载
  • 相关阅读:
    (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
    (转)Elasticsearch分析聚合
    搜索引擎-倒排索引基础知识(摘自《这就是搜索引擎:核心技术详解》)
    Elasticsearch5.x Head插件安装
    Java开发规范总结
    (转)ElasticSearch Java Api-检索索引库
    QTGraphics-View拖拽以及鼠标指针操作
    Qt Graphics-View的打印功能实现
    Qt使用QPainter绘制矢量图并保存为svg文件
    QT制作一个位图画图板程序
  • 原文地址:https://www.cnblogs.com/liszt/p/1999345.html
Copyright © 2011-2022 走看看