Unity3D 09-XML文件创建,读取,修改,添加

今天在工作之余学习了一下关于Unity中关于XML的部分。
在这里要注意添加两个命名空间,如下:

一、xml的解析

首先新建一个xml,可以命名为item.xml,拖进assets里面,内容如下:

<item>
  <item1>
    <id>1</id>
    <name>china</name>
    <year>2016</year>
  </item1>
  <item2>
    <id>2</id>
    <name>usa</name>
    <year>2017</year>
  </item2>
</item>

通过这个xml来解析。然后写一个.cs文件,注意需要导入这两个头文件

using System.Xml;     //xml操作
using System.IO;     //file操作

一个是对XML文件的命名空间,里面有关xml的很多api;
一个是对文件读写的命名空间,是对文件的读取,保存操作;

解析函数如下:

//解析xml
    void parseXml(){
        //也可以前面加上@,区别就是有@的话,双引号里面的内容不转义,比如" \" "
        //string filePath = Application.dataPath+@"/Resources/item.xml";
        string filePath = Application.dataPath+"/Resources/item.xml";
        if(File.Exists(filePath)){
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(filePath);
            XmlNodeList node = xmlDoc.SelectSingleNode("item").ChildNodes;
            //遍历节点
            foreach(XmlElement ele in node){
                //item下面的节点
                Debug.Log(ele.Name);

                if(ele.Name == "item1"){
                //first item1
                    foreach(XmlElement i1 in ele.ChildNodes){
                        Debug.Log(i1.Name);
                        if(i1.Name == "id"){
                            id1 = i1.InnerText;
                        }
                        if(i1.Name == "name"){
                            name1 = i1.InnerText;
                        }
                        if(i1.Name=="year"){
                            year1 = i1.InnerText;
                        }
                    }
                }
                if(ele.Name == "item2"){
                    //first item1
                    foreach(XmlElement i2 in ele.ChildNodes){
                        Debug.Log(i2.Name);
                        if(i2.Name == "id"){
                            id2 = i2.InnerText;
                        }
                        if(i2.Name == "name"){
                            name2 = i2.InnerText;
                        }
                        if(i2.Name=="year"){
                            year2 = i2.InnerText;
                        }
                    }
                }

            }
        }
        Debug.Log("id1: "+id1);
        Debug.Log("name1: "+name1);
        Debug.Log("year1: "+year1);
        Debug.Log("id2: "+id2);
        Debug.Log("name2: "+name2);
        Debug.Log("year2: "+year2);
    }

通过解析即可得到xml的值

后面的增删改其实不怎么用,因为一般都是策划直接修改表,而不用代码修改,但是还是可以看看。

二:XML文件创建、读取、修改、添加

代码如下:

using UnityEngine;
using System.Collections;
using System.Xml;
using System.IO;

public class XMLDemo : MonoBehaviour {
    private ArrayList Adialogue = new ArrayList();
    private ArrayList Bdialogue = new ArrayList();
    private ArrayList textList = new ArrayList();
    // Use this for initialization
    void Start () {


    }

    // Update is called once per frame
    void Update () {

    }

    void OnGUI() {
        if (GUI.Button(new Rect(50,50,100,50),"生成XML"))
        {
            CreateXML();
            Debug.Log("生成XML");
        }

        if (GUI.Button(new Rect(50,"读取XML"))
        {
            LoadXml();
            Debug.Log("读取XML");
        }

        if (GUI.Button(new Rect(50,150,"修改XML"))
        {
            updateXML();
            Debug.Log("修改XML");

        }

        if (GUI.Button(new Rect(50,200,"增加XML节点"))
        {
            addXMLData();
            Debug.Log("增加XML");
        }
    }

//创建XML
 void CreateXML()
    {
        string path = Application.dataPath + "/data2.xml";
        if (!File.Exists(path))
        {
            //创建最上一层的节点。
            XmlDocument xml = new XmlDocument();
            //创建最上一层的节点。
            XmlElement root = xml.CreateElement("objects");
            //创建子节点
            XmlElement element = xml.CreateElement("messages");
            //设置节点的属性
            element.SetAttribute("id","1");
            XmlElement elementChild1 = xml.CreateElement("contents");

            elementChild1.SetAttribute("name","a");
            //设置节点内面的内容
            elementChild1.InnerText = "这就是你,你就是天狼";
            XmlElement elementChild2 = xml.CreateElement("mission");
            elementChild2.SetAttribute("map","abc");
            elementChild2.InnerText = "去吧,少年,去实现你的梦想";
            //把节点一层一层的添加至xml中,注意他们之间的先后顺序,这是生成XML文件的顺序
            element.AppendChild(elementChild1);
            element.AppendChild(elementChild2);
            root.AppendChild(element);
            xml.AppendChild(root);
            //最后保存文件
            xml.Save(path);
        }
    }

//读取XML
 void LoadXml()
    {
        //创建xml文档
        XmlDocument xml = new XmlDocument();

        xml.Load(Application.dataPath + "/data2.xml");
        //得到objects节点下的所有子节点
        XmlNodeList xmlNodeList = xml.SelectSingleNode("objects").ChildNodes;
        //遍历所有子节点
        foreach (XmlElement xl1 in xmlNodeList)
        {

            if (xl1.GetAttribute("id") == "1")
            {
                //继续遍历id为1的节点下的子节点
                foreach (XmlElement xl2 in xl1.ChildNodes)
                {
                    //放到一个textlist文本里
                    //textList.Add(xl2.GetAttribute("name") + ": " + xl2.InnerText);
                    //得到name为a的节点里的内容。放到TextList里
                    if (xl2.GetAttribute("name") == "a")
                    {
                        Adialogue.Add(xl2.GetAttribute("name") + ": " + xl2.InnerText);
                        print("******************"+ xl2.GetAttribute("name") + ": " + xl2.InnerText);
                    }
                    //得到name为b的节点里的内容。放到TextList里
                    else if (xl2.GetAttribute("map") == "abc")
                    {
                        Bdialogue.Add(xl2.GetAttribute("name") + ": " + xl2.InnerText);
                        print("******************" + xl2.GetAttribute("name") + ": " + xl2.InnerText);
                    }
                }
            }
        }
        print(xml.OuterXml);
    }

//修改XML
    void updateXML()
    {
        string path = Application.dataPath + "/data2.xml";
        if (File.Exists(path))
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(path);
            XmlNodeList xmlNodeList = xml.SelectSingleNode("objects").ChildNodes;
            foreach (XmlElement xl1 in xmlNodeList)
            {
                if (xl1.GetAttribute("id") == "1")
                {
                    //把messages里id为1的属性改为5
                    xl1.SetAttribute("id","5");
                }

                if (xl1.GetAttribute("id") == "2")
                {
                    foreach (XmlElement xl2 in xl1.ChildNodes)
                    {
                        if (xl2.GetAttribute("map") == "abc")
                        {
                            //把mission里map为abc的属性改为df,并修改其里面的内容
                            xl2.SetAttribute("map","df");
                            xl2.InnerText = "我成功改变了你";
                        }

                    }
                }
            }
            xml.Save(path);
        }
    }

//添加XML
    void addXMLData()
    {
        string path = Application.dataPath + "/data2.xml";
        if (File.Exists(path))
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(path);
            XmlNode root = xml.SelectSingleNode("objects");
            //下面的东西就跟上面创建xml元素是一样的。我们把他复制过来就行了
            XmlElement element = xml.CreateElement("messages");
            //设置节点的属性
            element.SetAttribute("id","2");
            XmlElement elementChild1 = xml.CreateElement("contents");

            elementChild1.SetAttribute("name","b");
            //设置节点内面的内容
            elementChild1.InnerText = "天狼,你的梦想就是。。。。。";
            XmlElement elementChild2 = xml.CreateElement("mission");
            elementChild2.SetAttribute("map","def");
            elementChild2.InnerText = "我要妹子。。。。。。。。。。";
            //把节点一层一层的添加至xml中,注意他们之间的先后顺序,这是生成XML文件的顺序
            element.AppendChild(elementChild1);
            element.AppendChild(elementChild2);

            root.AppendChild(element);

            xml.AppendChild(root);
            //最后保存文件
            xml.Save(path);
        }
    }

相关文章

这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画...
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价...
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分...
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文...