2) 采用LINQ to XML技术必须要引用的命名空间
using System.Xml.Linq
3) 根据权限“标签”文件各XML元素如表1所示,通过LINQ to XML中XDocument类创建一个权限校验的XML模板。
//采用LINQ to XML技术创建一个权限校验XML文件
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("authconfig",
new XElement ("create","ssl"),
new XElement ("resoure","资源"),
new XElement("public"),
new XElement("protected"),
new XElement("private")));
4) 通过对LINQ to XML对指定的父XML元素进行查询并追加相应的权限记录信息
private void AppendNode(string ParentNodeName,XElement Node)
{
//查找相应父节点,以追加权限记录信息
var ParentNode = doc.Descendants(ParentNodeName).First(el=>el.Name.ToString()==ParentNodeName);
ParentNode.Add(Node);
ShowConfigInfo();
}
(5)权限记录信息的组织及追加权限记录信息方法的调用
权限记录信息采用LINQ to XML中XElement类来进行组织。当用户对权限记录信息的需求发生变更后(例如:增加读写/只读、收费/免费等权限),只需要在此处进行相应的处理就可以了,除XML文件解析处需要稍做调整外,其它代码基本不需改动。
var Node = new XElement("group", new XAttribute("name", cmbGroupName.SelectedItem.ToString()));
AppendNode("private", Node); //追加权限记录信息的方法调用
(6)权限记录信息解析
在此处给人感觉只是用来显示相关信息意义不大,实际使用中我们可以根据相应的遍历对一组用户来进行权限的校验,大大提高了响应速度。
//这里不对public与protected节点下的信息显示,目的是显示LINQ TO XML的另一种查询方法
//我们也可以从根节点直接遍历显示所有信息
var gpinfo = from el in doc.Elements("authconfig").Elements("private").Elements("group")
select el;
foreach (var item in gpinfo)
{
txtParse.Text = txtParse.Text + item.Attribute("name").Value + "\r\n";
}
(7)权限记录信息校验主要工作是对单个用户、组、节点访问某一资源时所需要的判断处理。下面代码分两部分,第一部分是针对带XML属性的权限记录文件查询,第二部分是针对不带属性的记录信息查询,请注意两种查询语句的不同之处。
1)带属性的权限记录信息查询
var query = from el in doc.Elements("authconfig").Elements("private").Elements(
cmbSearchType.SelectedItem.ToString())
where el.Attribute("name").Value == txtSearch.Text
select el;
if (query.Count() > 0)
txtParse.Text = "搜索成功";
else
txtParse.Text = "搜索失败"
2)不带属性的权限记录信息查询
var query= from el in doc.Elements("authconfig").Elements("private").Elements
(cmbSearchType.SelectedItem.ToString())
where el.Value == txtSearch.Text
select el;
if (query.Count() > 0)
txtParse.Text = "搜索成功";
else
txtParse.Text = "搜索失败";
五、结语 程序的可移植、可复用、可扩展一直以来都是程序员讨论的热门话题。微软推出系列新特性之一的LINQ to XML,使我们在资源权限灵活控制上实现了部分这样的想法。希望通过这个讨论能够起到抛砖引玉的作用。本文的例子在Windows XP SP3、Visual Studio 2008 SP1下编译通过。
|