• c#读写xml文件


    结果:这种格式:只有一个node结点

    <?xml version="1.0" encoding="utf-8"?>
    <RootName>
      <OnePersonNode name="LiLei" sex="male" age="12" />
      <OnePersonNode name="HanMeiMei" sex="female" age="11" />
    </RootName>
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Net.Mime;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    
    namespace xmlTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                ;
                string xmlSavePath = "data.xml";
                //-------------BEGIN-写 xml -------------------
    
                Program testProgram = new Program();
    
                //--初始化xml数据类
                List<PersonInfo> personInfoList;
                //填充具体数据
                testProgram.CreateData(out personInfoList);
                //真正创建
                testProgram.CreateXmlFile(personInfoList, xmlSavePath);
    
    
                //------------END--------------
    
    
                //---BEGIN--读 xml---------
    
                List<PersonInfo> mPeronInfoList = new List<PersonInfo>();
                XmlDocument readXml = new XmlDocument();
                readXml.Load(xmlSavePath);
                //获取根节点
                XmlNode xmlRootNode = readXml.SelectSingleNode(PersonInfo.mRootName);
                if (xmlRootNode != null)
                {
                    //所有节点
                    XmlNodeList nodeList = xmlRootNode.ChildNodes;
    
    
                    //--------BEGIN-修改--------
                    //修改节点的值 如没有则新加
                    for (int i = 0; i < nodeList.Count; ++i)
                    {
                        XmlNode tempNode = nodeList[i];
                        if (tempNode != null)
                        {
                            XmlElement oneElement = (XmlElement)tempNode;
                            if (oneElement.GetAttribute(PersonInfo.Name) == "LiLei")
                            {
                                oneElement.SetAttribute(PersonInfo.Age, "47");
                            }
                        }
                    }
                    //----------END-----------
    
    
                    //填充数据
                    for (int i = 0; i < nodeList.Count; ++i)
                    {
                        XmlNode tempNode = nodeList[i];
                        if (tempNode != null)
                        {
                            XmlElement oneElement = (XmlElement)tempNode;
                            PersonInfo tempPersonInfo = new PersonInfo(oneElement.GetAttribute(PersonInfo.Name)
                                                                        , oneElement.GetAttribute(PersonInfo.Sex)
                                                                        , oneElement.GetAttribute(PersonInfo.Age));
                            mPeronInfoList.Add(tempPersonInfo);
                        }
                    }
    
    
    
    
                }
                //----------END------------
    
                //打印测试:
                for (int i = 0; i < mPeronInfoList.Count; ++i)
                {
                    PersonInfo info = mPeronInfoList[i];
                    Console.Write(PersonInfo.Name + ":" + info.mNameVal + PersonInfo.Sex + ":" + info.mSexVal + PersonInfo.Age + ":" + info.mAgeVal);
                    Console.WriteLine();
                }
            }
    
    
            /// <summary>
            /// 一个节点的信息
            /// </summary>
    
            private class PersonInfo
            {
                public const string mRootName = "RootName";//根节点名称
                public const string mNodeName = "OnePersonNode";//node节点名称
    
                public const int AttSize = 3;
    
                public const string Name = "Name";
                public const string Sex = "Sex";
                public const string Age = "Age";
    
                public string mNameVal = string.Empty;
                public string mSexVal = string.Empty;
                public string mAgeVal = string.Empty;
    
                public PersonInfo(string fName, string fSex, string fAge)
                {
                    mNameVal = fName;
                    mSexVal = fSex;
                    mAgeVal = fAge;
                }
    
                public PersonInfo(string[] arr)
                {
                    if (arr != null && arr.Length == AttSize)
                    {
                        mNameVal = arr[0];
                        mSexVal = arr[1];
                        mAgeVal = arr[2];
                    }
                }
    
            }
    
    
            /// <summary>
            /// 数据的创建 
            /// </summary>
            private void CreateData(out List<PersonInfo> personInfoList)
            {
                personInfoList = new List<PersonInfo>();
                string[] valArr = { "LiLei", "male", "12" };
                PersonInfo tempInfo = new PersonInfo(valArr);
                personInfoList.Add(tempInfo);
    
                string[] valArr_2 = { "HanMeiMei", "female", "11" };
                tempInfo = new PersonInfo(valArr_2);
                personInfoList.Add(tempInfo);
            }
    
            private void CreateXmlFile(List<PersonInfo> personList, string savePath)
            {
                //-- 创建xml
                XmlDocument xmlDoc = new XmlDocument();
                XmlNode node = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");
                xmlDoc.AppendChild(node);
                //-- 创建root
                XmlNode root = xmlDoc.CreateElement(PersonInfo.mRootName);
                xmlDoc.AppendChild(root);
    
                //--填充每个node数据
                for (int i = 0; i < personList.Count; ++i)
                {
                    XmlNode tempNde = xmlDoc.CreateNode(XmlNodeType.Element, PersonInfo.mNodeName, null);
                    PersonInfo tempNodeInfo = personList[i];
    
                    CreateNodeAttribute(xmlDoc, tempNde, PersonInfo.Name, tempNodeInfo.mNameVal);
                    CreateNodeAttribute(xmlDoc, tempNde, PersonInfo.Sex, tempNodeInfo.mSexVal);
                    CreateNodeAttribute(xmlDoc, tempNde, PersonInfo.Age, tempNodeInfo.mAgeVal);
                    //添加节点
                    root.AppendChild(tempNde);
                }
    
                //保存数据
                try
                {
                    xmlDoc.Save(savePath);
                }
                catch (Exception e)
                {
                    //显示错误信息  
                    Console.WriteLine(e.Message);
                }
            }
    
            /// <summary>
            ///创建xml node内的元素 
            /// </summary>
            public void CreateNodeAttribute(XmlDocument xmlDoc, XmlNode node, string attributeName, string attVal)
            {
                if (xmlDoc != null && node != null)
                {
                    XmlAttribute attribute = xmlDoc.CreateAttribute(attributeName);
                    attribute.Value = attVal;
                    if (node.Attributes != null)
                    { node.Attributes.Append(attribute); }
                }
                else
                {
                    Debug.Assert(false, "xmlDoc or node is null!");
                }
            }
        }
    
    
    }

    获取文件的时间记录:

            /// <summary>
            /// 获取这个路径下的数据
            /// </summary>
            /// <param name="timeInfoList">填充到这里</param>
            /// <param name="fileName">路径</param>
            private void GetFileTimeData(ref List<TimeNodeInfo> timeInfoList, string fileName)
            {
                if (Directory.Exists(fileName))
                {
                    DirectoryInfo direction = new DirectoryInfo(fileName);
                    FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories); ;
                    string titleName = "正在检查" + fileName;
                    for (int i = 0; i < files.Length; i++)
                    {
                        if (!files[i].Name.EndsWith(".svn-base"))
                        {
                            int stringIdx = files[i].DirectoryName.IndexOf("Assets\", StringComparison.Ordinal);
                            string assetName = files[i].DirectoryName.Substring(stringIdx) + "\" + files[i].Name;
                            TimeNodeInfo tempTimeInfo = new TimeNodeInfo(assetName, files[i].LastWriteTime.Ticks.ToString());
                            timeInfoList.Add(tempTimeInfo);
                            EditorUtility.DisplayProgressBar(titleName, assetName, (float)i / (float)files.Length);
                        }
                    }
                }
            }

    下面是: 查询指定路径下, 文件的时间信息,并且 提供  某个文件是否被修改,然后进行时间数据的刷新操作。。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using UnityEditor;
    using UnityEngine;
    using Debug = System.Diagnostics.Debug;
    
    /// <summary>
    /// 文件的时间信息存储
    /// </summary>
    namespace Assets.Editor.ResTimeInfo
    {
        /// <summary>
        /// 单个节点的数据信息
        /// </summary>
        public class TimeNodeInfo
        {
            public const int mAttributeSize = 3;//一个node几个属性
            public const string FilePathName = "FilePathName";
            public const string TimeName = "Time";
            public const string YMRTimeName = "showTime";//直观形式
    
            public string mFilePath = string.Empty;
            public string mTime = string.Empty;
            public string mYMRtime = string.Empty;//年月日time形式 
    
            public TimeNodeInfo(string fFilePath, string fTime, string ymrTime)
            {
                mFilePath = fFilePath;
                mTime = fTime;
                mYMRtime = ymrTime;
            }
    
            public TimeNodeInfo(string[] arr)
            {
                if (arr != null && arr.Length == mAttributeSize)
                {
                    mFilePath = arr[0];
                    mTime = arr[1];
                    mYMRtime = arr[2];
                }
            }
        }
    
        class XmlTimeInfo
        {
            public XmlTimeInfo()
            {
    
    
    
    
            }
    
            private static XmlTimeInfo mInstance = null;
            public static XmlTimeInfo Instance
            {
                get
                {
                    if (mInstance != null)
                    {
                        return mInstance;
                    }
                    else
                    {
                        mInstance = new XmlTimeInfo();
                        return mInstance;
                    }
                }
            }
    
            public static string RootPath = Application.dataPath;
    
            public string AllFileSavePath = (RootPath.Replace("Assets", "RVL") + "/AllFileSavePath.xml");//所有文件时间数据存储路径
            public string ChangeFileSavePath = RootPath.Replace("Assets", "RVL") + "/ChangeFileSavePath.xml";//修改的文件存储路径 。。。估计不需要
    
            public string ResPath = "Assets/Res";//读取文件的路径Res
            public string ResourcePath = "Assets/Resources";//读取文件的路径Resources
    
            public string RootName = "RootName";
            public string NodeName = "Property";
    
            private XmlNode mRoot;
    
            private Dictionary<string, TimeNodeInfo> mTimeInfoDic = new Dictionary<string, TimeNodeInfo>();
    
            XmlDocument xmlDoc = new XmlDocument();
            /// <summary>
            /// 保存所有文件的时间信息
            /// AllFileTimeInfo.xml
            /// </summary>
            public void SaveAllResTimeInfo()
            {
                //--
    
                //填充具体数据
                CreateInitData(ref mTimeInfoDic);
                CreateXmlFile(mTimeInfoDic, AllFileSavePath);
    
            }
            /// <summary>
            /// 保存所有修改文件的时间信息
            /// ChangeFileTimeInfo.xml
            /// </summary>
            public void SaveChangeResTimeInfo()
            {
    
            }
    
            /// <summary>
            /// 这个文件是否更改?
            /// </summary> "Assets\Editor\AssetBuild\Old\999.txt"
            /// <param name="fFilePath">类似路径:"AssetsEditorAssetBuildOldNewCreateBundleEditor.cs.meta"</param>
            /// <returns></returns>
            public bool IsFileChange(string fFilePath)
            {
                //load当前xml 
                xmlDoc.Load(AllFileSavePath);
                //1.获取当前文件修改时间
                FileInfo nowFileInfo = null;
                try
                {
                    nowFileInfo = new FileInfo(fFilePath);
                }
                catch (Exception e)
                {
                    LogSystem.LogError("Error: fFilePath is not find :", fFilePath, "  ", e.ToString());
                }
    
                if (nowFileInfo != null)
                {
                    //2.获取dic中此文件的时间
                    string nowFileTime = nowFileInfo.LastWriteTime.Ticks.ToString();
                    string ymrTime = nowFileInfo.LastWriteTime.ToString();
                    TimeNodeInfo outInfo;
    
                    if (mTimeInfoDic.TryGetValue(fFilePath, out outInfo))
                    {
                        //3.时间是否相同
                        if (outInfo.mTime == nowFileTime)
                        {
                            return true;
                        }
                        else
                        {
                            mTimeInfoDic[fFilePath].mTime = nowFileTime;
                            mTimeInfoDic[fFilePath].mYMRtime = ymrTime;
                            //4.修改xml内容
                            ChangeXmlElement(mTimeInfoDic[fFilePath], AllFileSavePath);
                            return false;
                        }
                    }
                    else //4.说明是新的文件 add
                    {
                        outInfo = new TimeNodeInfo(fFilePath, nowFileTime, ymrTime);
                        mTimeInfoDic.Add(fFilePath, outInfo);
                        //新加内容
                        AddXmlOneElement(outInfo, AllFileSavePath);
                        return true;
                    }
                }
                else
                {
                    LogSystem.LogError("this path file info is null!" + fFilePath);
                }
                return false;
            }
    
            #region xml数据相关
            private void CreateInitData(ref Dictionary<string, TimeNodeInfo> fTimeInfoDic)
            {
                //-- 创建xml
                //-- 创建root
                mRoot = xmlDoc.SelectSingleNode(RootName);
                if (mRoot == null)
                {
                    XmlNode node = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");
                    xmlDoc.AppendChild(node);
    
                    mRoot = xmlDoc.CreateElement(RootName);
                    xmlDoc.AppendChild(mRoot);
                }
    
                string fullPath = "Assets/Editor/AssetBuild/Old" + "/";
                GetFileTimeData(ref fTimeInfoDic, fullPath);
                fullPath = "Assets/Editor/AssetBuild/New" + "/";
                GetFileTimeData(ref fTimeInfoDic, fullPath);
                EditorUtility.ClearProgressBar();
            }
    
            /// <summary>
            /// 获取这个路径下的时间数据
            /// </summary>
            /// <param name="timeInfoList">填充到这里</param>
            /// <param name="filePath">路径</param>
            private void GetFileTimeData(ref Dictionary<string, TimeNodeInfo> fTimeInfoDic, string filePath)
            {
                if (Directory.Exists(filePath))
                {
                    DirectoryInfo direction = new DirectoryInfo(filePath);
                    FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories); ;
                    string titleName = "正在检查" + filePath;
                    for (int i = 0; i < files.Length; i++)
                    {
                        if (!files[i].Name.EndsWith(".svn-base"))
                        {
                            string assetName = GetAssetsPath(files[i].DirectoryName, files[i].Name);
                            TimeNodeInfo tempTimeInfo = new TimeNodeInfo(assetName,
                                files[i].LastWriteTime.Ticks.ToString(),
                                  files[i].LastWriteTime.ToString());
    
                            if (!fTimeInfoDic.ContainsKey(tempTimeInfo.mFilePath))
                            {
                                fTimeInfoDic.Add(tempTimeInfo.mFilePath, tempTimeInfo);
                            }
                            else
                            {
                                fTimeInfoDic[tempTimeInfo.mFilePath] = tempTimeInfo;
                            }
    
                            EditorUtility.DisplayProgressBar(titleName, assetName, (float)i / (float)files.Length);
                        }
                    }
                }
            }
    
            /// <summary>
            /// 获取 文件相对 Assets文件下的路径
            /// </summary>
            /// <returns></returns>
            private string GetAssetsPath(string fDirectoryPath, string fileName)
            {
                int stringIdx = fDirectoryPath.IndexOf("Assets\", StringComparison.Ordinal);
                string assetName = fDirectoryPath.Substring(stringIdx) + "\" + fileName;
    
                return assetName;
            }
    
            /// <summary>
            /// 初始创建xml一次
            /// </summary>
            /// <param name="timeList"></param>
            /// <param name="savePath"></param>
            private void CreateXmlFile(Dictionary<string, TimeNodeInfo> fTimeInfoDic, string savePath)
            {
                //清除老数据
                RemoveOldData();
                //--填充每个node数据
                foreach (KeyValuePair<string, TimeNodeInfo> kvp in fTimeInfoDic)
                {
                    XmlNode tempNde = xmlDoc.CreateNode(XmlNodeType.Element, NodeName, null);
                    TimeNodeInfo tempNodeInfo = kvp.Value;
    
                    CreateNodeAttribute(xmlDoc, tempNde, TimeNodeInfo.FilePathName, tempNodeInfo.mFilePath);
                    CreateNodeAttribute(xmlDoc, tempNde, TimeNodeInfo.TimeName, tempNodeInfo.mTime);
                    CreateNodeAttribute(xmlDoc, tempNde, TimeNodeInfo.YMRTimeName, tempNodeInfo.mYMRtime);
                    //添加节点
                    mRoot.AppendChild(tempNde);
    
                }
                //保存数据
                try
                {
                    xmlDoc.Save(savePath);
                }
                catch (Exception e)
                {
                    //显示错误信息  
                    Console.WriteLine(e.Message);
                }
            }
            /// <summary>
            ///创建xml node内的元素 
            /// </summary>
            public void CreateNodeAttribute(XmlDocument xmlDoc, XmlNode node, string attributeName, string attVal)
            {
                if (xmlDoc != null && node != null)
                {
                    XmlAttribute attribute = xmlDoc.CreateAttribute(attributeName);
                    attribute.Value = attVal;
                    if (node.Attributes != null)
                    { node.Attributes.Append(attribute); }
                }
                else
                {
                    Debug.Assert(false, "xmlDoc or node is null!");
                }
            }
    
            /// <summary>
            /// 修改一个元素的时间
            /// </summary>
            public void ChangeXmlElement(TimeNodeInfo fNode, string savePath)
            {
                XmlNode xmlRootNode = xmlDoc.SelectSingleNode(RootName);
                if (xmlRootNode != null)
                {
                    //所有节点
                    XmlNodeList nodeList = xmlRootNode.ChildNodes;
                    for (int i = 0; i < nodeList.Count; ++i)
                    {
                        XmlNode tempNode = nodeList[i];
                        if (tempNode != null)
                        {
                            XmlElement oneElement = (XmlElement)tempNode;
                            if (oneElement.GetAttribute(TimeNodeInfo.FilePathName) == fNode.mFilePath)
                            {
                                oneElement.SetAttribute(TimeNodeInfo.TimeName, fNode.mTime);
                                oneElement.SetAttribute(TimeNodeInfo.YMRTimeName, fNode.mYMRtime);
                                xmlDoc.Save(savePath);
                            }
                        }
                    }
                }
            }
            /// <summary>
            ///  添加一个元素
            /// </summary>
            public void AddXmlOneElement(TimeNodeInfo fNode, string savePath)
            {
                XmlNode xmlRootNode = xmlDoc.SelectSingleNode(RootName);
                if (xmlRootNode != null)
                {
                    XmlNode tempNde = xmlDoc.CreateNode(XmlNodeType.Element, NodeName, null);
                    CreateNodeAttribute(xmlDoc, tempNde, TimeNodeInfo.FilePathName, fNode.mFilePath);
                    CreateNodeAttribute(xmlDoc, tempNde, TimeNodeInfo.TimeName, fNode.mTime);
                    CreateNodeAttribute(xmlDoc, tempNde, TimeNodeInfo.YMRTimeName, fNode.mYMRtime);
                    xmlRootNode.AppendChild(tempNde);
                    try
                    {
                        xmlDoc.Save(savePath);
                    }
                    catch (Exception e)
                    {
                        //显示错误信息  
                        Console.WriteLine(e.Message);
                    }
                }
            }
    
            public void RemoveOldData()
            {
    
                XmlNode xmlRootNode = xmlDoc.SelectSingleNode(RootName);
                if (xmlRootNode != null)
                {
                    xmlRootNode.RemoveAll();
                }
            }
    
            #endregion
        }
    }
    改变自己
  • 相关阅读:
    《ASP.NET1200例》实现投票的用户控件
    《转》这些年这些感悟
    《转》不要过打折的生活,当你发现这些你有了,说明你开始成熟了
    HTML控件ID和NAME属性及在CS页面获得.ASPX页面中HTML控件的值
    逻辑回归(1)
    MySQL笔记5-----索引(覆盖索引等)
    MySQL笔记4------面试问题
    MySQL-----笔记3:存储引擎
    Python可视化数据------seaborn
    树(2)-----leetcode(层、深度、节点)
  • 原文地址:https://www.cnblogs.com/sun-shadow/p/5407851.html
Copyright © 2020-2023  润新知