• 您的位置:首页 > 新闻动态 > Unity3D

    Xml文件操作(创建、读取、写入、修改)

    2022/9/11      点击:

    创建Xml文件

    创建Xml需要注意层级,一层有一层的添加到xml中:

    using System.IO;
    using System.Xml;
    using UnityEngine;
    
    public class Demo5 : MonoBehaviour
    {
        void Start()
        {
            CreateXML();
        }
    
        //创建XML
        void CreateXML()
        {
            string path = Application.streamingAssetsPath + "/data.xml";
            //创建xml文档
            XmlDocument xml = new XmlDocument();
            //创建根节点
            XmlElement root = xml.CreateElement("Node");
    
            //创建根节点的子节点
            XmlElement element = xml.CreateElement("Person");
            //设置根节点的子节点的属性
            element.SetAttribute("id", "1");
            //添加两个子节点到根节点的子节点的下面
            XmlElement elementChild1 = xml.CreateElement("Name");
            elementChild1.SetAttribute("name", "");
            elementChild1.InnerText = "王五";
            XmlElement elementChild2 = xml.CreateElement("Age");
            elementChild2.SetAttribute("age", "");
            elementChild2.InnerText = "18";
            //把节点一层一层的添加至xml中,注意他们之间的先后顺序,这是生成XML文件的顺序
            element.AppendChild(elementChild1);
            element.AppendChild(elementChild2);
            //再创建一个根节点的子节点
            XmlElement element2 = xml.CreateElement("Person");
            //设置根节点的子节点的属性 名字一样 属性不一样也可以
            element2.SetAttribute("id", "2");
            //添加两个子节点到根节点的子节点的下面
            XmlElement elementChild3 = xml.CreateElement("Name");
            elementChild3.SetAttribute("name", "");
            elementChild3.InnerText = "李四";
            XmlElement elementChild4 = xml.CreateElement("Age");
            elementChild4.SetAttribute("age", "");
            elementChild4.InnerText = "22";
            element2.AppendChild(elementChild3);
            element2.AppendChild(elementChild4);
            //把节点一层一层的添加至xml中,注意他们之间的先后顺序,这是生成XML文件的顺序
            root.AppendChild(element);
            root.AppendChild(element2);
            xml.AppendChild(root);
            //*后保存文件
            xml.Save(path);
        }
    }
    

    读取Xml文件

    读取Xml,需要从根节点一层一层往下找,根节点找子节点,子节点找孙节点。


    我们就先以查找属性的方式找到我们需要的节点数据:

    using System.IO;
    using System.Xml;
    using UnityEngine;
    
    public class Demo5 : MonoBehaviour
    {
        void Start()
        {
            LoadXml();
        }
    
        //读取XML
        void LoadXml()
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(Application.streamingAssetsPath + "/data.xml");
            XmlNodeList xmlNodeList = xml.SelectSingleNode("Node").ChildNodes;
            //遍历所有子节点
            foreach (XmlElement xl1 in xmlNodeList)
            {
                if (xl1.GetAttribute("id") == "1")
                {
                    //继续遍历id为1的节点下的子节点
                    foreach (XmlElement xl2 in xl1.ChildNodes)
                    {
                        if (xl2.GetAttribute("name") == "")
                        {
                            Debug.Log(xl2.InnerText);
                        }
                        else if (xl2.GetAttribute("age") == "")
                        {
                            Debug.Log(xl2.InnerText);
                        }
                    }
                }
            }
        }
    }
    根据节点的名字进行查找:


    using System.IO;
    using System.Xml;
    using UnityEngine;
    
    public class Demo5 : MonoBehaviour
    {
        void Start()
        {
            ReadXml();
        }
    
        //读取XML
        void ReadXml()
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(Application.streamingAssetsPath + "/data.xml");
            XmlNodeList xmlNodeList = xml.SelectSingleNode("Node").ChildNodes;
            //遍历所有子节点
            foreach (XmlElement xl1 in xmlNodeList)
            {
                if (xl1.Name == "Person" && xl1.GetAttribute("id") == "1")
                {
                    //继续遍历名字叫做Person,id为1的节点下的子节点
                    foreach (XmlElement xl2 in xl1.ChildNodes)
                    {
                        if (xl2.Name == "Name")
                        {
                            Debug.Log(xl2.InnerText);
                        }
                        else if (xl2.Name == "Age")
                        {
                            Debug.Log(xl2.InnerText);
                        }
                    }
                }
            }
        }
    }
    不知道名字属性怎么办


    using System.IO;
    using System.Xml;
    using UnityEngine;
    
    public class Demo5 : MonoBehaviour
    {
        void Start()
        {
            ReadXml();
        }
    
        //读取XML
        void ReadXml()
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(Application.streamingAssetsPath + "/data.xml");
            //获取根节点
            XmlNode rootNode = xml.FirstChild;
            XmlNodeList nodeList = rootNode.ChildNodes;
            //遍历所有子节点
            int Count = nodeList.Count;
            for (int i = 0; i < Count; i++)
            {
                Debug.Log(nodeList.Item(i).InnerText);
            }
        }
    }

    修改Xml文件

    修改Xml文件的数据,就需要根据节点的名字或者节点的属性找到对应的节点修改数据,之后保存文件即可:

    using System.IO;
    using System.Xml;
    using UnityEngine;
    
    public class Demo5 : MonoBehaviour
    {
        void Start()
        {
            UpdateXML();
        }
    
        //修改XML
        void UpdateXML()
        {
            string path = Application.streamingAssetsPath + "/data.xml";
            if (File.Exists(path))
            {
                XmlDocument xml = new XmlDocument();
                xml.Load(path);
                XmlNodeList xmlNodeList = xml.SelectSingleNode("Node").ChildNodes;
                foreach (XmlElement xl1 in xmlNodeList)
                {
                    if (xl1.GetAttribute("id") == "1")
                    {
                        //把id为1的属性改为5
                        xl1.SetAttribute("id", "5");
                    }
                    if (xl1.GetAttribute("id") == "2")
                    {
                        foreach (XmlElement xl2 in xl1.ChildNodes)
                        {
                            if (xl2.Name == "Name")
                            {
                                //修改其里面的内容
                                xl2.SetAttribute("name", "abc");
                                xl2.InnerText = "赵六";
                            }
                        }
                    }
                }
                xml.Save(path);
            }
        }
    }

    添加数据

    using System.IO;
    using System.Xml;
    using UnityEngine;
    
    public class Demo5 : MonoBehaviour
    {
        void Start()
        {
            AddXMLData();
        }
    
        //添加XML
        void AddXMLData()
        {
            string path = Application.streamingAssetsPath + "/data.xml";
            if (File.Exists(path))
            {
                XmlDocument xml = new XmlDocument();
                xml.Load(path);
                XmlNode root = xml.SelectSingleNode("Node");
                XmlElement element = xml.CreateElement("Person");
                //设置节点的属性
                element.SetAttribute("id", "2");
                XmlElement elementChild1 = xml.CreateElement("Name");
                elementChild1.SetAttribute("name", "ced");
                elementChild1.InnerText = "李四";
                XmlElement elementChild2 = xml.CreateElement("Age");
                elementChild2.SetAttribute("age", "123");
                elementChild2.InnerText = "11";
                //把节点一层一层的添加至xml中,注意他们之间的先后顺序,这是生成XML文件的顺序
                element.AppendChild(elementChild1);
                element.AppendChild(elementChild2);
                root.AppendChild(element);
                xml.AppendChild(root);
                //*后保存文件
                xml.Save(path);
            }
        }
    }

    添加数据使用AppendChild()函数进行添加。

    本文来自网络,版权归原作者所有。