C#Xml操作(增、删、改、查)限制访问IP操作
本文主要是以C#xml的XmlDocument 为主
总结一下C#操作Xml的方式
Xml文件如下所示
[HTML] 纯文本查看 复制代码 <?xml version="1.0" standalone="yes"?>
<dbGuest>
<User>
<Name>Guset</Name>
<City>上海</City>
<Email>fdfd</Email>
</User>
<User>
<Name>Gu</Name>
<City>上海</City>
<Email>fdfd</Email>
</User>
</dbGuest>
下面是一个简单的增删改查的类大家看一下就明白了
[C#] 纯文本查看 复制代码 using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.XPath;
namespace DsAndXML.OpXMLFile
{
/// <summary>
/// Main 的摘要说明。
/// </summary>
public partial class Main : System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
Bind();
}
//绑定数据
private void Bind()
{
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath(".\\db\\dbGuest.xml"));
dgShow.DataSource = ds.Tables[0].DefaultView;
dgShow.DataBind();
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
XmlNodeList elemList = doc.GetElementsByTagName("Name");
ddlName.Items.Clear();
for(int i=0;i<elemList.Count;i++)
ddlName.Items.Add(elemList.InnerXml);
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
//查询一个数据
protected void btnQuery_Click(object sender, System.EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
lbEmail.Text = doc.SelectSingleNode("//User[Name='"+ddlName.SelectedItem.Text+"']").ChildNodes.Item(2).InnerText;
}
//修改一个数据
protected void btnChange_Click(object sender, System.EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
xmlDoc.SelectSingleNode("//User[Name='"+ddlName.SelectedItem.Text+"']").ChildNodes.Item(2).InnerText = tbNewMail.Text.ToString().Trim();//获取dbGuest节点的所有子节点
xmlDoc.Save(Server.MapPath(".\\db\\dbGuest.xml"));
Bind();
}
//删除一个数据
protected void btnDelete_Click(object sender, System.EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
xmlDoc.SelectSingleNode("//User[Name='" + ddlName.SelectedItem.Text + "']").RemoveAll();
xmlDoc.Save(Server.MapPath(".\\db\\dbGuest.xml"));
Bind();
}
//添加一个数据
protected void btnAdd_Click(object sender, System.EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(".\\db\\dbGuest.xml"));
XmlNode root=xmlDoc.SelectSingleNode("dbGuest");//查找<dbGuest>
XmlElement xe1=xmlDoc.CreateElement("User");//创建一个<User>节点
XmlElement xesub1=xmlDoc.CreateElement("Name");
xesub1.InnerText="Guset";//设置文本节点
xe1.AppendChild(xesub1);//添加到<User>节点中
XmlElement xesub2=xmlDoc.CreateElement("City");
xesub2.InnerText="郑州";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("Email");
xesub3.InnerText="[url=mailto:sufei.1013@163.com]sufei.1013@163.com[/url]";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<dbGuest>节点中
xmlDoc.Save(Server.MapPath(".\\db\\dbGuest.xml"));
Bind();
}
}
}
这个例子很是经典希望大家能用的上啊
下面一起来看看怎么读取所有Xml内容的方法
[C#] 纯文本查看 复制代码 string strXml = File.ReadAllText(Server.MapPath("~\\Xml\\Messages.txt")).ToString();
ClientScriptManager csm = this.ClientScript;
csm.RegisterStartupScript(this.GetType(), "sufei",strXml);
[/code]
下面再来看一下面这个Xml文件
[code=html]<?xml version="1.0" encoding="UTF-8"?>
<ipcount>
<url>
<value>192.168.1.250</value>
<!--接入IP就是访问本站的IP-->
<count>150</count>
<!--本IP访问次数-->
</url>
<url>
<value>192.168.26.25</value>
<count>29</count>
</url>
</ipcount>
下面咱们要完成的工作就是限制IP的问题,这个应该是每个网站都有的情况下面我提供一个方法大家看一下就明白了。
[C#] 纯文本查看 复制代码 #region 文件操作
/// <summary>
/// 传入一个IP查询出这个IP对应的今日查询次数
/// </summary>
/// <param name="ip">IP</param>
/// <returns>返回是否验证通过True是通过</returns>
public static Boolean SelectIpToCount(string ip, string _filePath)
{
//真值是通过
Boolean returnboolean = false;
//定义文件名和路径
_filePath = _filePath + DateTime.Now.ToString("yyyy-MM-dd") + ".xml";
//检查是否创建文档成功
if (CreateXmlFile(_filePath))
{
//检查来源IP是否为空
if (ip != null)
{
//查询配置的最高查询次数
int ipcount = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["IpCount"].Trim());
//XmlDocument
XmlDocument objdoc = new XmlDocument();
//加载Xml文档
objdoc.Load(_filePath);
//IP对应的查询次数
string ipnode = "";
//取到相应IP的Count节点//是在全部范围内查询,/是在指定结构中查询
XmlNode xmlnode = objdoc.SelectSingleNode("//ip[value='" + ip + "']/count");
//验证是否取存在Count节点
if (xmlnode != null)
ipnode = xmlnode.InnerText.Trim();
//验证是否存在数据
if (ipnode != null && ipnode != "")
{
//查询Xml文档里的数据
int xmlipcount = Convert.ToInt32(ipnode.Trim());
//验证当前的查询次数是否超出最高限制,最高限制可以在Config文档里进行配置
if (xmlipcount <= ipcount)
{
//修改次数
objdoc.SelectSingleNode("//ip[value='" + ip + "']/count").InnerText =
(xmlipcount + 1).ToString();
//保存修改后的结果
objdoc.Save(_filePath);
returnboolean = true;
}
else
{
returnboolean = false;
}
}
else
{
//添加一个之前先找到根节点
XmlNode root = objdoc.SelectSingleNode("ipcount");
//学节点
XmlNode xmlip = objdoc.CreateElement("ip");
//IP下的Value节点
XmlNode xmlvalue = objdoc.CreateElement("value");
xmlvalue.InnerText = ip;
//添加到IP
xmlip.AppendChild(xmlvalue);
//IP下的count节点
XmlNode xmlcount = objdoc.CreateElement("count");
xmlcount.InnerText = "1";
//添加到IP
xmlip.AppendChild(xmlcount);
//把IP添加的根节点
root.AppendChild(xmlip);
//保存文档
objdoc.Save(_filePath);
returnboolean = true;
}
}
else
{
returnboolean = false;
}
}
else
{
returnboolean = false;
}
return returnboolean;
}
/// <summary>
/// 创建Xml文件 的方法
/// </summary>
/// <param name="filepath">路径</param>
/// <returns></returns>
private static Boolean CreateXmlFile(string filepath)
{
try
{
//记录成功时的记录
if (!File.Exists(filepath))
{
string TOEXCELLR1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><ipcount></ipcount>";
StreamWriter xmlfs = new StreamWriter(filepath, true, System.Text.Encoding.UTF8);
xmlfs.Write(TOEXCELLR1);
xmlfs.Close();
return true;
}
else
{
return true;
}
}
catch (Exception)
{
return false;
}
}
#endregion
使用方法更简单
看代码
SelectIpToCount(ip, filepath) IP就是人本次访问的IP,filepath就是文件路径在这里只要指定到文件夹就行了,我上面的方法会自动每天创建一个新的文件,这样防止数量太大,执行比较慢的可能性。
|