公司的考勤功能这就要上线,在签到这个模块中,由于签到功能只能在公司内部使用,也就是在一个固定的范围内使用,没有像钉钉那样有外勤签到,随着版本的升级,有一个这样的需求,每个公司的地理位置不同(经纬度就不同),公司的上下班时间不同,而且这些东西有可能是变化的,这就导致了统计签到记录的信息不同。
以前这些信息时写死的,不容易变更,本来我想在数据库中设计一张表来维护这些变量,当然,只有管理员才可以维护,但是为了节省访问时间,我就将这一些信息写在了XML里面,这样一来,在某些情况下程序读XML的速度肯定比读取数据库的速度要快,但是要是维护数据,只能修改XML了,不能再手机APP页面上直接操纵了,嗨,鱼和熊掌不可兼得啊!
下面展示一下我的代码
1、 XML存放数据代码
<?xml version="1.0" encoding="utf-8" ?>
<workMessage>
<Field>100</Field>
<item>
<id>beijing</id>
<ontime>08:30:00</ontime>
<offtime>17:30:00</offtime>
<lng>116.605454512445</lng>
<lat>31.4554521245455</lat>
</item>
<item>
<id>xian</id>
<ontime>09:00:00</ontime>
<offtime>18:00:00</offtime>
<lng>128.5454212545458</lng>
<lat>64.787445245457841</lat>
</item>
</workMessage><span style="font-family:SimSun;font-size:18px;"> </span>
2、 实体类
public class WorkMessages
{
private string id;
public string Id
{
get { return id; }
set { id = value; }
}
private string ontime;
public string OnTime
{
get { return ontime; }
set { ontime = value; }
}
private string offtime;
public string OffTime
{
get { return offtime; }
set { offtime = value; }
}
private double lat;
public double Lat
{
get { return lat; }
set { lat = value; }
}
private double lng;
public double Lng
{
get { return lng; }
set { lng = value; }
}
public WorkMessages()
{
}
public WorkMessages(string id, string ontime, string offtime,double lat,double lng)
{
this.Id = id;
this.OnTime = ontime;
this.OffTime = offtime;
this.Lat = lat;
this.Lng = lng;
}
3、 读取XML中的信息
public List<WorkMessages> QueryWorkMessages()
{
List<WorkMessages> list = new List<WorkMessages>();
XmlDocument xml = new XmlDocument();
xml = XmlManager(HttpContext.Current.Server.MapPath("../XmlConfig/Punch.xml"));
string id = "";
string ontime = "";
string offtime = "";
double lat = 0.00;
double lng = 0.00;
WorkMessages info = null;
//*******下面开始循环读取xml文件信息********/
foreach (XmlNode node in xml.ChildNodes)
{
if (node.Name == "workMessage")
{
foreach (XmlNode node1 in node.ChildNodes)
{
if (node1.Name == "item")
{
foreach (XmlNode node2 in node1.ChildNodes)
{
switch (node2.Name)
{
case "id":
id = node2.InnerText;
break;
case "ontime":
ontime = node2.InnerText;
break;
case "offtime":
offtime = node2.InnerText;
break;
case "lat":
lat = Convert.ToDouble(node2.InnerText);
break;
default:
lng = Convert.ToDouble(node2.InnerText);
break;
}
}
info = new WorkMessages(id, ontime, offtime, lat, lng);
//将信息保存至集合
list.Add(info);
}
}
}
}
return list;
}
4、 根据路径加载XML
public XmlDocument XmlManager(string strUrlPath)
{
XmlDocument xmlDocument = new XmlDocument();
if (!File.Exists(strUrlPath))
{
throw new Exception("指定的文件路径错误 请重新指定");
}
try
{
xmlDocument.Load(strUrlPath);
}
catch
{
throw new Exception("加载XML文档时发生错误");
}
return xmlDocument;
}
小结
用XML代替数据库适合存储比较轻量级的数据,这里我用XML代替数据库的好处是操作简单,访问速度快,缺点是维护困难,需要打开代码往XML中手动添加数据。提醒一下,根据路径读取XML时,XML的路径最好写成相对路径,别写成绝对路径,比如说路径为C:\pagage\punch.xml,如果写成这样,当把程序发布到服务器上的时候程序再读xml有可能就报错了。