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 );
}

原文地址:https://www.cnblogs.com/meihuizi/p/6403796.html