




















一年前俺想跳槽,面试了几个公司,其中一个公司的技术总监面试之后给了一道上机题让回家做(还给俺说这题去网上也找不到),并在晚上12点之前发给他。当时俺没做,今天闲来无事想起这道题就做做看,仔细想想,这道题看似简单,还是挺有内涵的,至少在我经历的面试里边是让我看重的一个。闲说少说,题目如下:
总体需求:
在某系统中,有一个模块,功能需求是:从数据源中读取一组数据,用户可以根据模版选择不同的展示界面.
程序设计人员将这个模块为两部来做.
1.先从数据库中读取一组数据,转换成XML数据,做为数据源提供给展示层.
2.以XML做为数据源,提供至少两种展现界面,并且用户可以从提供的多种界面中选择一个.
A:列表展现
|
姓名 |
出生日期 |
性别 |
学历 |
|
李世民 |
1950年1月1日 |
男 |
研究生 |
|
秦始皇 |
1960年1月1日 |
男 |
专科 |
|
孔明 |
1970年1月1日 |
男 |
博士 |
|
小白 |
1990年1月1日 |
男 |
初中 |
|
慈禧 |
1940年1月1日 |
女 |
本科 |
B摘要展现形式
李世民 男1950年1月1日
职业皇帝,名声不错。做的最悔的事是兄弟相残,所以天天做恶梦。但也做了不少好事。开创贞观之治。是唐代最盛之时期。
秦始皇 男 1960年1月1日
职业皇帝。原名赢政。统一六国成为他最大功绩。是中国历史上第一皇帝,称始皇帝。
…………………….
C 标签形式展现形式
性别:男 生日:1960年1月1日
学历:专科
简介:职业皇帝。原名赢政。统一六国成为他最大功绩。是中国历史上第一皇帝,称始皇帝
(模版要使用单独的模版文件,后期需要添加模版文件,以添加展现的形式。)
进度:
1.取得数据并转换成XML数据的工作,已经完成(见data.xml).
2.为xml数据源开发两个展示的界面.(一.列表形式的展现形式,二提供摘要形式的展现形式.)
题目:
1.用文字描述可以实现的方案,描述时需要涉及期关键的技术点。(至少提供2种解决方案,每个方案5分)共10分.
(注:如果15分钟之内不能提供解决方案。可以寻求提示,我们会给你三种设计方案。但此步骤无分)
2.可以根据其中的一个方案,进行详细设计.(共40分)
流程图(15分)
方法(函数)规划(25分)
方法1.中文名称
输入参数
输出参数
功能描述
方法2.中文名称
输入参数
输出参数
功能描述
方法3.中文名称
输入参数
输出参数
功能描述
.............
展示的实现思路:
从需求中的三种展现形式中,选择其中两种,描述技术实现思路,应用到的技术。
(注:这部分可以不做,但记0分)
3.根据设计开发程序.(50分)
只写出一个模版得10分
写出模版转换的关键代码得10分。
第二个写出了“列表模版”或“摘要展现形式”得20分,
第二个写出了“标签展现”得20
三个全写出得30分。
我用两种方法实现了:
方法1.利用
public partial class convert : System.Web.UI.UserControl
{
protected System.Web.UI.HtmlControls.HtmlGenericControl list; //模板文件中的用来标记行记录的div
protected void Page_Load(object sender, EventArgs e)
{
//xmldocList:导入行记录的模板-》从数据源中取得记录后加入其中-》作为html代码传回模板文件
XmlDocument xmldocList = new XmlDocument();
try
{
xmldocList.LoadXml(list.InnerHtml); //导入需要处理部分的html代码,需要符合xml格式
}
catch
{
list.InnerHtml = "导入的模板文件格式不符合标准!";
}
XmlNodeList nodeTemplate = xmldocList.GetElementsByTagName("repeat");//记录模板
DataService ds = new DataService();
XmlDocument xmldoc = ds.getData(); //获得数据
XmlNodeList nodelist = xmldoc.GetElementsByTagName("item"); //数据源中的记录行
StringBuilder sb = new StringBuilder();
int i = 0 ;
foreach (XmlNode node in nodelist)//数据源中的一个记录节点 =》xmldocList中的一个节点
{
if (node.HasChildNodes)
{
foreach (XmlNode nodeItem in nodeTemplate) //记录模板的每一列
{
XmlNode nodetr = nodeItem.FirstChild.CloneNode(true);
foreach (XmlNode nodeCol in node.ChildNodes)//根据记录模板中的标记字符进行内容替换
{
nodetr.InnerXml = nodetr.InnerXml.Replace("[" + nodeCol.Name + "]", nodeCol.InnerText);
nodetr.InnerXml = nodetr.InnerXml.Replace("[ID]",i.ToString());
}
nodeItem.AppendChild(nodetr);
}
}
i++;
}
foreach (XmlNode nodeItem in nodeTemplate)
{
nodeItem.RemoveChild(nodeItem.FirstChild); //不再需要记录模板,把记录模板节点去掉
}
//把xmldocList.InnerXml中的标记子符去掉,作为html代码赋给页面
list.InnerHtml = System.Text.RegularExpressions.Regex.Replace(xmldocList.InnerXml, "<repeat>|</repeat>|<template>|</template>","");
}
}
当时不明白那个技术总监出题的意图,现在明白了,他其实想考察俺有没有把页面表现和业务逻辑分层以及代码复用的意识。
这里是我的答案,载ie7下测试试过,在firefox下测试时发现不支持window.onload方法,算了,不管了
代码 :/Files/mapk/my2008.rar
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。