Persistance des données Unity-XML

XML (Extensible Markup Language) est conçu pour «structurer» la transmission et le stockage des données, transporter des données et échanger des données.
Les documents XML, ou fichiers texte, sont écrits conformément aux règles de grammaire XML et, par essence, les
documents String doivent contenir root éléments. Cet élément est l'élément parent de tous les autres éléments! Les éléments du document XML forment une arborescence de documents. Commencez à partir de la racine de cet arbre et développez (tous les éléments peuvent avoir des sous-éléments)
XML est très approprié pour la transmission Web, fournissant une méthode unifiée pour décrire et échanger des données structurées indépendamment des applications ou des fournisseurs,
facile à interagir à distance avec d'autres systèmes, Le partage de données est plus pratique

La classe xmlDocument se trouve dans System.Xml, qui analyse spécifiquement les documents XML.
Méthode xmlDocument.Save ("XXX"): enregistrez le document XML dans le chemin XXX
Méthode xmlDocument.Load ("XXX"): sélectionnez le nom du XML document à [charger] analysé
xmlElement .InnerText: Récupère les informations textuelles à l'intérieur du nœud

Processus d'écriture XML:
créer un nœud racine
Insérez la description de l'image ici

Créer un nœud pour chaque ensemble de données
Insérez la description de l'image ici

Ajouter le nœud créé au nœud racine

Sauver:
Insérez la description de l'image ici

Si le fichier n'existe pas, il sera créé automatiquement

Notez que le stockage ne peut être que des données de type chaîne , sinon, il doit être converti en chaîne.

Spécial: s'il s'agit du stockage de dictionnaires et de listes, il en va de même. Vous ne pouvez stocker les données que dans des chaînes une par une, et vous ne pouvez pas stocker directement les dictionnaires et les listes:
Insérez la description de l'image ici

XmlElement Cnode1 = xmlDocument.CreateElement("Cnode1");
            Cnode1.InnerText = save.c[0][0];
            Cnode1.SetAttribute("Cnode2", save.c[1][2]); //前一个是list列表第二个元素,后一个是字典中int 所对应的2的内容:e.Add(2, "@#$%^&*()");
            Cnode1.SetAttribute("Cnode3", "这是同一个Cnode1节点下的数据");
            root.AppendChild(Cnode1);

            //Cnode1.InnerText = save.c[0][1];使用InnerText如果不创建同名节点,会在同节点下覆盖内容
            //root.AppendChild(Cnode1);

            Cnode1 = xmlDocument.CreateElement("Cnode1");
            Cnode1.InnerText = save.c[0][1];
            root.AppendChild(Cnode1);

            Cnode1 = xmlDocument.CreateElement("Cnode1");
            Cnode1.InnerText = "这是同名Cnode1节点下的数据";
            root.AppendChild(Cnode1);

Enfin, le nœud racine est ajouté à xmlDocument et stocké à l'aide de la méthode Save:

Méthode de lecture:
1.
Déterminez d' abord si le chemin existe: 2. Créez XmlDocument, utilisez XmlDocument, la méthode Load pour lire
3. Obtenez tous les nœuds avec le même nom par nom et retournez une collection dans l'ordre
Insérez la description de l'image ici

Remarque dans le processus d'utilisation:
un nœud créé peut avoir plusieurs attributs, et plusieurs attributs créés sous le même nœud peuvent également être lus.

Ajouter des données de nœud avec le même nom : créez un nœud à chaque fois , CreateElement (le même nom peut être utilisé, et le même nom renverra une liste dans l'ordre lors de la lecture)

Ajoutez les mêmes données de nœud: utilisez SetAttribute
Insérez la description de l'image ici

Le stockage final est:

Insérez la description de l'image ici

Lisez le nœud du même nom:

///同名节点读取
                XmlNodeList cLoad = xmlDocument.GetElementsByTagName("Cnode1");
                //读取所有名为Cnode1的节点
                d.Add(0, cLoad[0].InnerText);//添加一个字典
                d.Add(1, cLoad[1].InnerText);
                //save.c.Add(d); 同一个字典添加两次 会在list 里面有两个这个字典(序号不同)
                save.c.Add(d);

                
                //save.c.Add(d); 不要将改过的字典再次添加(会再次添加改过后的字典),应该直接通过list的【】调用对应字典的add方法
                save.c[0].Add(2, cLoad[2].InnerText);

Lisez différents attributs du même nœud:

 ///同一个节点,读取属性
                //XmlAttributeCollection XmlAttributeCollection = cLoad[0].Attributes;
                //XmlNode xmlNode = XmlAttributeCollection.GetNamedItem("Cnode1");//读取属性,不能读取未添加的属性,即节点名不等于属性名,例如Cnode1
                //e.Add(0, xmlNode.InnerText);

                XmlAttributeCollection XmlAttributeCollection1 = cLoad[0].Attributes;
                XmlNode xmlNode1 = XmlAttributeCollection1.GetNamedItem("Cnode2");//要根据属性的name值 读取
                e.Add(1, xmlNode1.InnerText);


                XmlAttributeCollection XmlAttributeCollection2 = cLoad[0].Attributes;
                XmlNode xmlNode2 = XmlAttributeCollection2.GetNamedItem("Cnode3");
                e.Add(2, xmlNode2.InnerText);

                save.c.Add(e);

Lire l'exemple:

private static void Main(string[] args)
        {
    
    
            Console.WriteLine("Hello World!");
            //SaveByXML();

           
            Save save = LoadByXML();
          
            Console.WriteLine(save.a);
            Console.WriteLine(save.b);
            Console.WriteLine(save.c[0][0]);//取列表第一个字典d的 键值整数0 对应的string
            Console.WriteLine(save.c[0][1]); 
            Console.WriteLine(save.c[0][2]);
            //Console.WriteLine(save.c[1][0]);//取列表第二个字典e的 键值整数0 对应的string
            Console.WriteLine(save.c[1][1]);
            Console.WriteLine(save.c[1][2]);

        }

Insérez la description de l'image ici

Résumé: La
création d'
un nœud avec le même nom est compliquée, mais la lecture retourne directement à la liste, ce qui est pratique pour lire le même nœud et écrire plusieurs données en fonction du nom. Il est pratique d'écrire, et il n'y a pas besoin de créer des nœuds fréquemment, mais la lecture est compliquée et chaque lecture de données doit être créée. XmlAttributeCollection et XmlNode.

Code complet:

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml;

namespace 序列化反序列化
{
    
    
    [Serializable]
    public class Save
    {
    
    
        public int a;
        public string b;

        public List<Dictionary<int, string>> c = new List<Dictionary<int, string>>();
    }

    internal class Program
    {
    
    
        public static Dictionary<int, string> d = new Dictionary<int, string>();
        public static Dictionary<int, string> e = new Dictionary<int, string>();

        private static void Main(string[] args)
        {
    
    
            Console.WriteLine("Hello World!");
            //SaveByXML();//保存方法

            Save save = LoadByXML();//读取方法
            
            Console.WriteLine(save.a);
            Console.WriteLine(save.b);
            Console.WriteLine(save.c[0][0]);//取列表第一个字典的 键值整数0 对应的string
            Console.WriteLine(save.c[0][1]); 
            Console.WriteLine(save.c[0][2]);
            //Console.WriteLine(save.c[1][0]);//此节点没有和节点名相同的属性名,因此不存在Cnode1属性的数据
            Console.WriteLine(save.c[1][1]);
            Console.WriteLine(save.c[1][2]);

        }

        public static Save initDate()
        {
    
    
            Save save = new Save();
            save.a = 18;
            save.b = "Hello Save";
            d.Add(0, "这是一个键值为0的字典的内容");
            d.Add(1, "This is the contents of a dictionary with a key value of 1");
            e.Add(2, "@#$%^&*()");
            save.c.Add(d);
            save.c.Add(e);
            return save;
        }

        public static void SaveDateBtSerialize()
        {
    
    
            Save save = initDate();
            BinaryFormatter bf = new BinaryFormatter();//创造一个二进制对象
            FileStream fileStream = File.Create("C:/Users/17641/Desktop" + "/date.txt");
            bf.Serialize(fileStream, save);
            fileStream.Close();
        }

        public static Save LoadDateBtSerialize()
        {
    
    
            if (File.Exists("C:/Users/17641/Desktop" + "/date.txt"))
            {
    
    
                //读取文件
                BinaryFormatter bf = new BinaryFormatter();
                FileStream fileStream = File.Open("C:/Users/17641/Desktop" + "/date.txt", FileMode.Open);

                Save save = bf.Deserialize(fileStream) as Save;
                fileStream.Close();
                return save;
            }
            else
            {
    
    
                Console.WriteLine("文件不存在");
                return null;
            }
        }

        public static void SaveByXML()
        {
    
    
            Save save = initDate();
            XmlDocument xmlDocument = new XmlDocument();

            #region CreatXML elements

            XmlElement root = xmlDocument.CreateElement("Save");
            root.SetAttribute("fileName", "file_01");

            XmlElement Anode = xmlDocument.CreateElement("Anode");
            Anode.InnerText = save.a.ToString();
            root.AppendChild(Anode);

            XmlElement Bnode = xmlDocument.CreateElement("Bnode");
            Bnode.InnerText = save.b;
            root.AppendChild(Bnode);

            XmlElement Cnode1 = xmlDocument.CreateElement("Cnode1");
            Cnode1.InnerText = save.c[0][0];
            Cnode1.SetAttribute("Cnode2", save.c[1][2]); //前一个是list列表第二个元素,后一个是字典中int 所对应的2的内容:e.Add(2, "@#$%^&*()");
            Cnode1.SetAttribute("Cnode3", "这是同一个Cnode1节点下的数据");
            root.AppendChild(Cnode1);

            //Cnode1.InnerText = save.c[0][1];使用InnerText如果不创建同名节点,会在同节点下覆盖内容
            //root.AppendChild(Cnode1);

            Cnode1 = xmlDocument.CreateElement("Cnode1");
            Cnode1.InnerText = save.c[0][1];
            root.AppendChild(Cnode1);

            Cnode1 = xmlDocument.CreateElement("Cnode1");
            Cnode1.InnerText = "这是同名Cnode1节点下的数据";
            root.AppendChild(Cnode1);

            #endregion CreatXML elements

            xmlDocument.AppendChild(root);

            xmlDocument.Save("C:/Users/17641/Desktop" + "/date.txt");
            if (File.Exists("C:/Users/17641/Desktop" + "/date.txt"))
            {
    
    
                Console.WriteLine("XML FILE SAVE");
            }
        }

        public static Save LoadByXML()
        {
    
    
            Save save = new Save();
            if (File.Exists("C:/Users/17641/Desktop" + "/date.txt"))
            {
    
    
                XmlDocument xmlDocument = new XmlDocument();
             
                xmlDocument.Load("C:/Users/17641/Desktop" + "/date.txt");

                XmlNodeList aLoad = xmlDocument.GetElementsByTagName("Anode");
                //建立一个list集合 装载某个节点下的所有元素
                save.a = int.Parse(aLoad[0].InnerText);

                XmlNodeList bLoad = xmlDocument.GetElementsByTagName("Bnode");
                save.b = bLoad[0].InnerText;
                ///同名节点读取
                XmlNodeList cLoad = xmlDocument.GetElementsByTagName("Cnode1");
                d.Add(0, cLoad[0].InnerText);//添加一个字典
                d.Add(1, cLoad[1].InnerText);
                //save.c.Add(d); 同一个字典添加两次 会在list 里面有两个这个字典(序号不同)
                save.c.Add(d);

                
                //save.c.Add(d); 不要将改过的字典再次添加(会再次添加改过后的字典),应该直接通过list的【】调用对应字典的add方法
                save.c[0].Add(2, cLoad[2].InnerText);

                ///同一个节点,读取属性
                //XmlAttributeCollection XmlAttributeCollection = cLoad[0].Attributes;
                //XmlNode xmlNode = XmlAttributeCollection.GetNamedItem("Cnode1");//读取属性,不能读取未添加的属性,即节点名不等于属性名,例如Cnode1
                //e.Add(0, xmlNode.InnerText);

                XmlAttributeCollection XmlAttributeCollection1 = cLoad[0].Attributes;
                XmlNode xmlNode1 = XmlAttributeCollection1.GetNamedItem("Cnode2");//要根据属性的name值 读取
                e.Add(1, xmlNode1.InnerText);



                XmlAttributeCollection XmlAttributeCollection2 = cLoad[0].Attributes;
                XmlNode xmlNode2 = XmlAttributeCollection2.GetNamedItem("Cnode3");
                e.Add(2, xmlNode2.InnerText);

                save.c.Add(e);


            }

            return save;
        }
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/euphorias/article/details/108401111
conseillé
Classement