using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml; //重要
using System.IO;
// 本程序將演練XML文擋的讀與寫
// 也就是XMLReader和XMLWriter
namespace test11
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
FlueList();
}
// 刷新顯示ListBox顯示的內容
private void FlueList()
{
try
{
listBox1.Items.Clear();
FileStream fs = new FileStream("myTestXML.xml", FileMode.Open);
XmlReader tr = XmlReader.Create(fs);
while (!tr.EOF)
{
if (tr.MoveToContent() == XmlNodeType.Element && tr.Name == "Username")
{
listBox1.Items.Add(tr.ReadElementString());
}
tr.Read();
}
fs.Close();
tr.Close();
}
catch
{
// 導入時遇到無法導入數據,則文件出錯,將提示用戶刪除文件并建立新文件信息。
MessageBox.Show("文擋不可用,無法導入!", "錯誤");
if (MessageBox.Show("是否建立新的用戶文擋?/n此操作將刪除以前所有用戶數據", "程序提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
// 建立新文件,此用一個無參數函數重載。
CreateNewFile();
}
}
}
private void button1_Click(object sender, EventArgs e)
{
string username = textBox1.Text;
string password = textBox2.Text;
// 需要檢查用戶名和密碼同時不能為空,并且不能和記錄相重復。
if (username != "" && password != "" && checkReport(username, password))
{
try
{
XmlDocument doc = new XmlDocument();
doc.Load("myTestXML.xml");
XmlElement User = doc.CreateElement("User");
User.SetAttribute("UserSettig", "Customer");
// 創建一個Username標簽
XmlElement newUsername = doc.CreateElement("Username");
newUsername.InnerText = username;
User.AppendChild(newUsername);
// 創建一個Password標簽
XmlElement newPassword = doc.CreateElement("Password");
newPassword.InnerText = password;
User.AppendChild(newPassword);
doc.DocumentElement.AppendChild(User);
// 將以上信息寫入到xml文件。
XmlTextWriter tr = new XmlTextWriter("myTestXML.xml", null);
tr.Formatting = Formatting.Indented;
doc.WriteContentTo(tr);
tr.Close();
MessageBox.Show("寫入成功!", "成功");
FlueList();
// 以上條件通過后,方可進行寫入操作。
// 此方法是將XML文擋重寫,記錄全無,因此舍棄此方法。
// 此方法在后面用于錯誤處理,建立新文件時。
/*
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
XmlWriter thisWriter = XmlWriter.Create("myTestXML.xml", settings);
// 首行的聲明
thisWriter.WriteStartDocument();
// 開始輸入內容到文件中
thisWriter.WriteStartElement("User");
thisWriter.WriteAttributeString("UserSetting", "Customer");
thisWriter.WriteElementString("Username", username);
thisWriter.WriteElementString("Password", password);
thisWriter.WriteEndElement();
thisWriter.WriteEndDocument();
thisWriter.Flush();
thisWriter.Close();
MessageBox.Show("寫入成功!", "成功");
*/
}
catch
{
CreateNewFile(username, password);
}
}
else
{
MessageBox.Show("請確定輸入是否正確或有重名和密碼重復", "請檢查");
}
}
// 如果文件讀寫出錯,則刪除建立一個新文件。
// 此函數有一個無參數的函數重載。
// 好象這個有參數的函數也沒什么用處。唉……不知道當初怎么想的。
private void CreateNewFile(string username, string password)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
XmlWriter thisWriter = XmlWriter.Create("myTestXML.xml", settings);
// 首行的聲明
thisWriter.WriteStartDocument();
// 開始輸入內容到文件中
thisWriter.WriteStartElement("UserList");
thisWriter.WriteStartElement("User");
thisWriter.WriteAttributeString("UserSetting", "Customer");
thisWriter.WriteElementString("Username", username);
thisWriter.WriteElementString("Password", password);
thisWriter.WriteEndElement();
thisWriter.WriteEndElement();
thisWriter.WriteEndDocument();
thisWriter.Flush();
thisWriter.Close();
MessageBox.Show("寫入成功!", "成功");
}
// 上面創建新文件的函數的無參數重載部分。
private void CreateNewFile()
{
try
{
// 如果文件存在則刪除該文件,建立正確的新文件。
if (File.Exists("myTestXML.xml"))
{
File.Delete("myTestXML.xml");
}
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
XmlWriter thisWriter = XmlWriter.Create("myTestXML.xml", settings);
// 首行的聲明
thisWriter.WriteStartDocument();
// 開始輸入內容到文件中
thisWriter.WriteStartElement("UserList");
thisWriter.WriteEndElement();
thisWriter.WriteEndDocument();
thisWriter.Flush();
thisWriter.Close();
}
catch
{
MessageBox.Show("建立新文擋失敗!/n請檢查文件 myTestXML.xml 是否只讀!", "程序錯誤");
}
}
// 檢查是否有重復的用戶名和密碼,此函數返回一個Bool值
private bool checkReport(string username, string password)
{
try
{
FileStream fs = new FileStream("myTestXML.xml", FileMode.Open);
XmlReader tr = XmlReader.Create(fs);
string thisusername = "", thispassword = "";
while (!tr.EOF)
{
if (tr.MoveToContent() == XmlNodeType.Element && tr.Name == "Username")
{
thisusername = tr.ReadElementString();
}
else if (tr.MoveToContent() == XmlNodeType.Element && tr.Name == "Password")
{
thispassword = tr.ReadElementString();
}
if (thisusername == username && thispassword == password)
{
tr.Close();
fs.Close();
return false;
}
tr.Read();
}
fs.Close();
tr.Close();
return true;
}
catch
{
// 錯誤處理,如果文擋不存在,或者文擋錯誤,將刪除文擋,并從新建立。
MessageBox.Show("文擋不可用,無法查詢!", "錯誤");
if (MessageBox.Show("是否建立新的用戶文擋?/n此操作將刪除以前所有用戶數據", "程序提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
// 調用無參數函數重載版本建立新文件。
CreateNewFile();
}
return true;
}
}
// 檢查用戶名和密碼是否可用的函數。
private void button2_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" && textBox2.Text != "" && checkReport(textBox1.Text, textBox2.Text))
{
MessageBox.Show("此用戶名和密碼可以用", "通過");
}
else
{
MessageBox.Show("此用戶名和密碼不可用", "未通過");
}
}
// 退出該程序。
private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
新聞熱點
疑難解答