XML是一种很方便的描述数据的方法,其格式也比较接近HTML,因此就有了想把XML直接通过网页的形式显示在浏览器中的想法。但是直接打开XML文件,浏览器是无法解析的,只是把文档的结构原封不动地呈现出来而已。例如,我们有一个学生课程表的文档schedule.xml,用浏览器直接打开是这个样子的。(不过不知道为什么只能在IE中打开,在chrome中打开后无法显示,求教)

那么如何将XML文档能够以比较容易看懂的方式显示在网页上呢?通过查找资料以后得知有一种XML文档叫做XSLT(EXtensible Stylesheet Language Transform,可扩展样式表语言转换)。详见http://www.w3school.com.cn/xsl/index.asp。

接着就是要选择我们比较容易看懂的形式了。由于是课程表,我们当然首选采用表格的形式展现。但是在确定展现的具体手段时却遇到了瓶颈。究竟是采用课程驱动、还是时间驱动的形式?经过反复试验和调试,终于确定以时间为驱动,采用逐单元格填充的方式进行转换。最终生成的XSLT代码如下(部分):

  1. <?xml version="1.0" encoding="gb2312"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.   <xsl:template match="/">
  4.     <html>
  5.       <body>
  6.         <h2>我的课程表</h2>
  7.         <table border="1">
  8.           <tr bgcolor="#9acd32">
  9.             <th></th>
  10.             <th align="center">1</th>
  11.             <th align="center">2</th>
  12.             <th align="center">3</th>
  13.             <th align="center">4</th>
  14.             <th align="center">5</th>
  15.             <th align="center">6</th>
  16.             <th align="center">7</th>
  17.             <th align="center">8</th>
  18.             <th align="center">9</th>
  19.             <th align="center">10</th>
  20.             <th align="center">11</th>
  21.           </tr>
  22.           <tr>
  23.             <td>周一</td>
  24.             <xsl:for-each select="schedule/day">
  25.               <xsl:if test="week = '周一'">
  26.                 <td>
  27.                   <xsl:for-each select="course">
  28.                     <xsl:choose>
  29.                       <xsl:when test="time = 1">
  30.                         <xsl:value-of select="name"></xsl:value-of>
  31.                       </xsl:when>
  32.                       <xsl:otherwise>
  33.                       </xsl:otherwise>
  34.                     </xsl:choose>
  35.                   </xsl:for-each>
  36.                 </td>
  37.                 ...
  38.             </xsl:if>
  39.             </xsl:for-each>
  40.           </tr>
  41.           ....
  42.           </table>
  43.       </body>
  44.     </html>
  45.   </xsl:template>
  46. </xsl:stylesheet>

接下来就是要将XML和XSLT结合起来了。

XML输出有两种方式,一种是流的形式,另一种是文件的形式。采用流的方式其实并不适用,因为文档流默认是填充在一个文件的前面的,如果是采用HTML或者ASPX等文件,会影响整个文档的结构。因此采用文件的方法,即将所有XML节点写入一个文件,并保存在服务器上。当然,随着用户数量的增多,生成的XML文件必然会越来越多,所以还得增加一个定期删除的机制,这个不在我们讨论范围之内因此不再赘述。

之前从数据库中读出数据并写入一个List的方法如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Configuration;
  6. using System.Xml;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. namespace CampusSystem
  10. {
  11.     public enum Weekday { 周一, 周二, 周三, 周四, 周五 };
  12.     public struct CourseToXML
  13.     {
  14.         public string course_id;
  15.         public string name;
  16.         public Weekday week;
  17.         public string[] times;
  18.     }
  19.     public static class ScheduleMaker
  20.     {
  21.         static string connString = ConfigurationManager.ConnectionStrings["CampusConnectionString"].ConnectionString;
  22.         static CampusDBDataContext db = new CampusDBDataContext(connString);
  23.         public static List<CourseToXML> MakeScheduleList(string uid)
  24.         {
  25.             string course_id = string.Empty;
  26.             string name = string.Empty;
  27.             string allTime = string.Empty;
  28.             CourseToXML ctx = new CourseToXML();
  29.             List<CourseToXML> ctxl = new List<CourseToXML>();
  30.             var mySchedule = from ms in db.Schedule where ms.student_id == uid select ms.course_id;
  31.             foreach (string cid in mySchedule)
  32.             {
  33.                 var courseInfo = from ci in db.Course where ci.course_id == cid select new { ci.course_id, ci.name, ci.time };
  34.                 foreach (var c in courseInfo)
  35.                 {
  36.                     course_id = c.course_id;
  37.                     name = c.name;
  38.                     allTime = c.time;
  39.                     string[] oneTimes = allTime.Split(';');
  40.                     foreach (string oneTime in oneTimes)
  41.                     {
  42.                         string[] weekAndTime = oneTime.Split(',');
  43.                         string week = weekAndTime[0];
  44.                         string[] times = weekAndTime[1].Split('.');
  45.                         ctx.course_id = course_id;
  46.                         ctx.name = name;
  47.                         ctx.times = times;
  48.                         switch (week)
  49.                         {
  50.                             case "周一":
  51.                                 ctx.week = Weekday.周一;
  52.                                 break;
  53.                             case "周二":
  54.                                 ctx.week = Weekday.周二;
  55.                                 break;
  56.                             case "周三":
  57.                                 ctx.week = Weekday.周三;
  58.                                 break;
  59.                             case "周四":
  60.                                 ctx.week = Weekday.周四;
  61.                                 break;
  62.                             case "周五":
  63.                                 ctx.week = Weekday.周五;
  64.                                 break;
  65.                             default:
  66.                                 break;
  67.                         }
  68.                         ctxl.Add(ctx);
  69.                     }
  70.                 }
  71.             }
  72.             ctxl.Sort((CourseToXML ctxA, CourseToXML ctxB) =>
  73.             {
  74.                 if (ctxA.week == ctxB.week)
  75.                     return ctxA.times[0].CompareTo(ctxB.times[0]);
  76.                 else
  77.                     return ctxA.week.CompareTo(ctxB.week);
  78.             });
  79.             return ctxl;
  80.         }
  81.    }
  82. }

需要查询的页面schedule.aspx如下:(前提是需要有一个存放生成后的html文档的html文件。)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Xml;
  8. using System.Xml.Xsl;
  9. namespace CampusSystem
  10. {
  11.     public partial class schedule : System.Web.UI.Page
  12.     {
  13.         string uid;
  14.         protected void Page_Load(object sender, EventArgs e)
  15.         {
  16.             uid = GetUID();
  17.             List<CourseToXML> list = ScheduleMaker.MakeScheduleList(uid); //读出数据库中数据
  18.             MakeScheduleXML(list, uid); //生成XML文档
  19.             XslCompiledTransform xslt = new XslCompiledTransform();
  20.             xslt.Load(Server.MapPath("schedule.xsl"));
  21.             xslt.Transform(Server.MapPath("Schedule/schedule_" + uid + ".xml"), Server.MapPath("schedule.html"));
  22.        //这个方法就是将指定的XML文件通过指定的XSL文件转换以后生成到一个指定的html文件中。
  23.             Response.Redirect("schedule.html");
  24.         }
  25.         private string GetUID()
  26.         {
  27.             string uid = string.Empty;
  28.             HttpCookie cookie = Request.Cookies["LOGIN"];
  29.             if (cookie != null) // 若Cookie不为空,则采用cookie
  30.             {
  31.                 uid = cookie["uid"];
  32.             }
  33.             else // 否则采用Session
  34.             {
  35.                 uid = (string)Session["uid"];
  36.             }
  37.             return uid;
  38.         }
  39.         protected void MakeScheduleXML(List<CourseToXML> list, string uid)
  40.         {
  41.             XmlDocument xmlDoc = new XmlDocument();
  42.             XmlDeclaration decl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
  43.             xmlDoc.AppendChild(decl);
  44.             XmlElement root = xmlDoc.CreateElement("schedule");
  45.             xmlDoc.AppendChild(root);
  46.             for (int weekday = 0; weekday < 5; weekday++)
  47.             {
  48.                 XmlNode nodeDay = xmlDoc.CreateElement("day");
  49.                 root.AppendChild(nodeDay);
  50.                 XmlNode week = null;
  51.                 switch (weekday)
  52.                 {
  53.                     case 0:
  54.                         week = xmlDoc.CreateElement("week");
  55.                         week.InnerText = Weekday.周一.ToString();
  56.                         break;
  57.                     case 1:
  58.                         week = xmlDoc.CreateElement("week");
  59.                         week.InnerText = Weekday.周二.ToString();
  60.                         break;
  61.                     case 2:
  62.                         week = xmlDoc.CreateElement("week");
  63.                         week.InnerText = Weekday.周三.ToString();
  64.                         break;
  65.                     case 3:
  66.                         week = xmlDoc.CreateElement("week");
  67.                         week.InnerText = Weekday.周四.ToString();
  68.                         break;
  69.                     case 4:
  70.                         week = xmlDoc.CreateElement("week");
  71.                         week.InnerText = Weekday.周五.ToString();
  72.                         break;
  73.                     default:
  74.                         break;
  75.                 }
  76.                 nodeDay.AppendChild(week);
  77.                 foreach (CourseToXML ctx in list)
  78.                 {
  79.                     XmlNode course = null;
  80.                     if (weekday == (int)(ctx.week))
  81.                     {
  82.                         course = xmlDoc.CreateElement("course");
  83.                         foreach (string t in ctx.times)
  84.                         {
  85.                             XmlNode time = xmlDoc.CreateElement("time");
  86.                             time.InnerText = t;
  87.                             course.AppendChild(time);
  88.                         }
  89.                         XmlNode name = xmlDoc.CreateElement("name");
  90.                         name.InnerText = ctx.name;
  91.                         course.AppendChild(name);
  92.                         nodeDay.AppendChild(course);
  93.                     }
  94.                 }
  95.             }
  96.             xmlDoc.Save(Server.MapPath("Schedule/schedule_" + uid + ".xml"));
  97.         }
  98.     }
  99. }

运行以后自动返回所生成的html文档,就能看到结果了。

虽然还略显简陋就是了,当然,这个可以通过css来控制,这里也不再赘述。

总结

为了完成这个任务,采取了一切能想到的方法。包括XMLDocument,XSLT转换,LINQ,泛型,Lambda表达式,还有XML本身的设计等等,很多知识的大综合。也是对自己学习能力和综合应用能力一个提高。真正的成就感就是在这样不断解决问题的过程中产生的,也是给了我继续把项目做好的动力。

转载于:https://www.cnblogs.com/ryuasuka/archive/2013/05/29/3105362.html

ASP.NET中自动生成XML文件并通过XSLT显示在网页中的方法相关推荐

  1. linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法

    在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...

  2. php如何新建xml文件,PHP中的生成XML文件的4种方法分享

    生成如下XML串 Xml代码 title1 content1 2009-10-11 title2 content2 2009-11-11 方法I.[直接生成字符串]使用纯粹的PHP代码生成字符串,并把 ...

  3. java 关于xml的注解,自动生成xml文件 - @XML***

    用的是jdk自带的javax.xml.bind.JAXBContext将对象和xml字符串进行相互转换. 如果对要生成的 xml 格式有点些许的限制,就会对生成xml的对象就需要进行些许控制,控制对象 ...

  4. JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***

    点击打开链接 目前用到这几个标签: @XmlRootElement:根节点 @XmlAttribute:该属性作为xml的attribute @XmlElement:该属性作为xml的element, ...

  5. doc自动生成html,java web应用中自动生成文章html页面的实现.doc

    java web应用中自动生成文章html页面的实现 java web应用中自动生成文章html页面的实现 2009-11-09 00:24:15 标签:web开发,页面转换 [推送到技术圈] 版权声 ...

  6. 修改SDE中自动生成的web.xml文件

    SDE中的web.xml文件是自动生成,所以,不能直接修改,只能修改SDE的模版文件.<?xml:namespace prefix = o ns = "urn:schemas-micr ...

  7. [附下载]功能最强、高效易用的AI自动标注软件免费用了,兼容LabelImg格式xml,支持各种yolo、ssd、rcnn已训练模型以及OCR、形状匹配、轮廓匹配等各种定位方式来自动生成标注文件

    你将收获 掌握自动标注软件在Windows下系统配置方法 掌握利用灵活搜索来自动生成标注文件的方法 掌握利用训练好的网络模型来自动生成标注文件的方法 掌握利用OCR文字识别来自动生成标注文件的方法 适 ...

  8. Django项目中的子项目中自动生成自己想要的文件内容

    当我们用命令生成子项目时,会自动生成一些文件,如下图所示: 那为什么会自动生成这些文件呢? 原因如下: 那么如何自动生成我们自己想要的文件呢? 可以直接在app_template文件夹中新建文件,然后 ...

  9. python中dom模块_Python中使用dom模块生成XML文件示例

    在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件. 在生成XML文件中,我们主 ...

最新文章

  1. Kubernetes1.5源码分析(二) apiServer之资源注册
  2. 清华张学工团队入选“人类细胞图谱计划”首批项目
  3. IDEA坑爹跟新的小BUG解决之道
  4. C++ 标准库类型 set
  5. im4java profile_GraphicsMagick+im4java
  6. solaris php,solaris 十系统上架构phpwind论坛环境(转)
  7. 微博取关列表怎么看_微表情心理学:教你怎么从手的动作,去看他人真实的内心想法...
  8. java语言基本语法_Java语言基本语法
  9. 漫谈C++:良好的编程习惯与编程要点
  10. mac svn 设置代理
  11. POJ 1236 Network of Schools(强连通 Tarjan+缩点)
  12. 8、周期性任务、find、break和continue 学习笔记
  13. ThreadLocal,静态变量,实例变量,局部变量的线程安全
  14. 在Mac下连接阿里云服务器
  15. NSGA-II资料合集
  16. 【转译】玩黑莓你必须了解的10件事
  17. 简单常用的10个excel公式
  18. [ERP/鼎捷E10][销售分销]发出商品余额表取数逻辑及SQL
  19. 计算机学机械制图吗,机械制图为什么这么难学?
  20. 的it生活_双子IT男性格随和、爱美食懂生活,会给女朋友准备小惊喜 | 企鹅来电VOL.03...

热门文章

  1. centos rpm
  2. MongoDB Collections
  3. C语言 select
  4. java arraylist
  5. 2.6 更多导数的例子
  6. docker image
  7. Pandas 文本数据方法 cat()
  8. 2019年12月中国编程语言排行和薪资分析
  9. Spring MVC学习总结(18)——SpringMVC事务Transactional注解使用总结
  10. Windows学习总结(14)——最常用的Windows快捷键再总结