xml文件,xml格式字符串 讀寫


最近工作需要寫一個小工具,對會員卡卡號進行修改,需要修改的會員卡號存放在excel中,其中有id,正確卡號,當前錯誤卡號,狀態    4列,為了不讓用戶隨意修改excel內容,需要將excel轉化為xml,然后對xml進行加密,在程序中讀取xml內容,放到字符串中,進行解密,然后在讀卡后,查找xml是否有對應的錯誤卡號,如果有將卡號修改為正確卡號,然后修改成功后需要將這張卡的狀態置為已修改。

/// <summary>
        /// 使用NPOI讀取excel,將數據放到新創建的xml中
        /// </summary>
        /// <param name="filePath">excel路徑</param>
        private void ExportExcel(string filePath)
        {
            XmlDocument doc = new XmlDocument();
            XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
            doc.AppendChild(dec);
            //創建一個根節點
            XmlElement root = doc.CreateElement("CardsInfo");
            doc.AppendChild(root);
            IWorkbook wk = null;
            string extension = System.IO.Path.GetExtension(filePath);//獲取擴展名
            try
            {
                FileStream fs = File.OpenRead(filePath);
                //if(extension.Equals)
                if (extension.Equals(".xls"))
                {
                    //把xls文件中的數據寫入wk中
                    wk = new HSSFWorkbook(fs);
                }
                fs.Close();
                ISheet sheet = wk.GetSheetAt(0);
                IRow row = sheet.GetRow(1);//獲取當前行數據
                for (int i = 2; i <= sheet.LastRowNum; i++)
                {
                    row = sheet.GetRow(i);  //讀取當前行數據
                    if (row != null)
                    {
                        //LastCellNum 是當前行的總列數
                        XmlElement node = doc.CreateElement("Card");
                        node.SetAttribute("ID", row.GetCell(0).ToString());
                        node.SetAttribute("CorrectCardNum", row.GetCell(1).ToString());
                        node.SetAttribute("ErrorCardNum", row.GetCell(2).ToString());
                        node.SetAttribute("Satus", "");
                        root.AppendChild(node);
 
                    }
                }
                doc.Save("bb.xml");
                Console.Write(doc.OuterXml);
 
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
 
            }
 
        }
 bb.xml :

<?xml version="1.0" encoding="UTF-8"?>
<CardsInfo>
<Card ID="1" CorrectCardNum="201603011" ErrorCardNum="20163011" Satus="" />
<Card ID="2" CorrectCardNum="201603012" ErrorCardNum="20163012" Satus="" />

......

</CardsInfo>

//現在的bb.xml是明文的,為了安全,需要對其加密,使用AES加密
   /// <summary>
        /// 將xml轉化為字符串,然后進行AES加密,存到aes.xml中
        /// </summary>
        private void xmlToString()
        {
            XmlDocument xdoc = new XmlDocument();
            xdoc.Load("bb.xml");//加載xml文件
            string aesCardInfo=AES.Encrypt(xdoc.InnerXml);將內容進行加密
            FileStream fs = new FileStream("aes.xml", FileMode.Append);
            StreamWriter sw = new StreamWriter(fs);
            sw.Write(aesCardInfo);
            sw.Flush();
            sw.Close();
        }

到目前為止,我們用的aes.xml是亂碼的,用戶不知道這個文件xml存了什么,相對安全

//下面是讀取aes.xml,解密,將信息存到list,並展示到datagridview中

/// <summary>
/// 將xml解密,並將信息存放到list,且展示在gridview List<CardInfo>
/// </summary>
private void decryptionXml()
{
List<CardInfo> cardInfoList = new List<CardInfo>();
XmlDocument xdoc = new XmlDocument();
XmlNodeList xnlist = explainXmlStr(ref xdoc);
foreach (XmlNode xn in xnlist)
{

CardInfo ci = new CardInfo();
XmlElement xe = (XmlElement)xn;
ci.ID = xe.GetAttribute("ID").ToString();
ci.CorrectCardNum = xe.GetAttribute("CorrectCardNum").ToString();
ci.ErrorCardNum = xe.GetAttribute("ErrorCardNum").ToString();
ci.Satus = xe.GetAttribute("Satus").ToString() == "" ? "未修正" : "已修正";
cardInfoList.Add(ci);
}
dataGridView_card.DataSource = cardInfoList;

dataGridView_card.Columns[0].HeaderText = "ID";
dataGridView_card.Columns[1].HeaderText = "正確卡號";
dataGridView_card.Columns[2].HeaderText = "錯誤卡號";
dataGridView_card.Columns[3].HeaderText = "狀態";
}

 

/// <summary>
/// 讀取加密的xml,解密,解析成XmlNodeList
/// </summary>
/// <returns></returns>
private XmlNodeList explainXmlStr(ref XmlDocument xdoc)
{
string content = File.ReadAllText(dir).ToString();//讀取xml文件內容
string AESDecryptStr = AES.AESDecrypt(content);//xml解密后字符串
xdoc = new XmlDocument();
xdoc.LoadXml(AESDecryptStr);
XmlNode xnode = xdoc.SelectSingleNode("CardsInfo");
XmlNodeList xnlist = xnode.ChildNodes;
return xnlist;
}

 //修改xml 中某節點信息,保存

private void modify()

{

XmlDocument xml = new XmlDocument();
XmlNodeList xnlist = explainXmlStr(ref xml);

foreach (XmlNode xn in xnlist)
{
XmlElement xe = (XmlElement)xn;

if (xe.GetAttribute("ErrorCardNum").ToString()==CardNum) //查到對應節點
{

if (cardID.Write(xe.GetAttribute("CorrectCardNum").ToString()))//修改會員卡卡號
{

xe.SetAttribute("Satus","已修改");//將xml對應節點的狀態修改為已修改

SaveXmlStr(xml);

WriteLog(filename, CardNum, "Success");//記錄日志

 

}

/// <summary>
/// 保存修改后的xml對象
/// </summary>
/// <param name="xd"></param>
private void SaveXmlStr(XmlDocument xd)
{
string xmlStr = xd.InnerXml.ToString();//xml內容
string aesCardInfo = AES.Encrypt(xmlStr);//加密
//string dd = AES.AESDecrypt(aesCardInfo);
FileStream fs = new FileStream(dir, FileMode.Create);//在dir路徑下覆蓋原來的xml文件
StreamWriter sw = new StreamWriter(fs);
sw.Write(aesCardInfo);
sw.Flush();
sw.Close();
decryptionXml();//修改后重新加載gridview 
}

private void CopySetting()
{
string sourcePath = "D:\\軟件\\管理系統\\Config\\Settings.xml";//要復制的源文件
string destPath = Path.Combine(System.Windows.Forms.Application.StartupPath, "Config\\Settings.xml");//目標路徑文件名
if (File.Exists(destPath ))
File.Delete(destPath );
System.IO.File.Copy(sourcePath , destPath );
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM