Unity读写XML文件

Unity读写文件,文件用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, 100, 100, 50), "读取XML"))
        {
            LoadXml();
            Debug.Log("读取XML");
        }

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

        }

        if (GUI.Button(new Rect(50, 200, 100, 50), "增加XML节点"))
        {
            addXMLData();
            Debug.Log("增加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");
            element.SetAttribute("name", "2");
            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);
        }
    }


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


    //修改
    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") == "5")
                {
                    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);
        }
    }
}

对于节点删除的操作

  //删除节点内容  
   private void DelXml(string image)  
   {  
       XmlDocument xmlDoc = new XmlDocument();  
       xmlDoc.Load(Server.MapPath("../flash/dati.xml"));  
  
       XmlNodeList xnl = xmlDoc.SelectSingleNode("images").ChildNodes; //查找节点  
         
       foreach (XmlNode xn in xnl)  
       {  
           XmlElement xe = (XmlElement)xn;  
           if (xe.InnerText.IndexOf(image,0) >= 0)  
           {  
               xn.ParentNode.RemoveChild(xn);  
              // xn.RemoveAll();  
           }  
       }  
       xmlDoc.Save(Server.MapPath("../flash/dati.xml"));  
   }  
  


下面是方法中xpath的用法


最常见的XML数据类型有:Element, Attribute,Comment, Text.  
  
   Element, 指形如<Name>Tom<Name>的节点。它可以包括:Element, Text, Comment, ProcessingInstruction, CDATA, and EntityReference.  
  
   Attribute, 指在<Employee >中的粗体部分。  
  
   Comment,指形如:<!-- my comment --> 的节点。  
  
   //Text,指在<Name>Tom<Name>的粗体部分。  
  
  在XML中,可以用XmlNode对象来参照各种XML数据类型。  
  
   2.1 查询已知绝对路径的节点(集)  
  
   objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee”)  
  
  或者  
  
   objNodeList = objNode.SelectNodes(“/Company/Department/Employees/Employee”)  
  
  以上两种方法可返回一个NodeList对象,如果要返回单个节点可使用SelectSingleNode方法,该方法如果查询到一个或多个节点,返回第一个节点;如果没有查询的任何节点返回 Nothing。例如:  
  
   objNode = objNode.SelectSingleNode(“/Company/Department/Employees/Employee”)  
   
  
   2.2 查询已知相对路径的节点(集)  
  
  可使用类似于文件路径的相对路径的方式来查询XML的数据  
  
   objNode = objDoc.SelectSingleNode(“Company/Department”)  
  
  
   2.3 查询已知元素名的节点(集)  
  
  在使用不规则的层次文档时,由于不知道中间层次的元素名,可使用//符号来越过中间的节点,查询其子,孙或多层次下的其他所有元素。例如:  
  
   objNodeList = objDoc.SelectNodes(“Company//Employee”)  
  
   2.4 查询属性(attribute)节点  
  
  以上的各种方法都返回元素(element)节点(集),返回属性(attribute),只需要采用相应的方法,在属性名前加一个@符号即可,例如:  
  
   objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee/@id”)  
  
  // 2.5 查询Text节点  
  
  //使用text()来获取Text节点。  
  
   //objNode = objDoc.SelectSingleNode(“Company/Department/Deparmt_Name/text()”)  
  
   2.6 查询特定条件的节点  
  
  使用[]符号来查询特定条件的节点。例如:  (如果用XmlNode接收的节点,想要更改属性值就要强转成XmlElement)
  
   a. 返回id号为 10102的Employee节点  
  
   objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee[@id=’10102’]”)  
  
   //b. 返回Name为Zhang Qi的Name 节点  
  
   //objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee/Name[text()=’Zhang Qi’]”)  
  
   c. 返回部门含有职员22345的部门名称节点  
  
   objNode = objDoc.SelectSingleNode("Company/Department[Employees/Employee/@id='22345']/Department_Name")  
  
   2.7 查询多重模式的节点  
  
  使用 | 符号可以获得多重模式的节点。例如:  
  
   objNodeList = objDoc.SelectNodes(“Company/Department/Department_Name | Company/Department/Manager”)  
  
   2.8 查询任意子节点  
  
  使用*符号可以返回当前节点的所有子节点。  
  
   objNodeList = objDoc.SelectNodes(“Company/*/Manager)  
  
  或者  
  
   objNodeList = objNode.ChildNodes  
  
    
  
   3 XML数据的编辑  
  
   3.1 增加一个元素的属性(attribute)节点  
  
   objNodeAttr As XmlNode  
  
   objNodeAttr = objDoc.CreateAttribute("id", Nothing)  
  
   objNodeAttr.InnerXml = "101"  
  
   objNode.Attributes.Append(objNodeAttr)  
  
   3.2 删除一个元素的属性  
  
   objNode.Attributes.Remove(objNodeAttr)  
  
   3.3 增加一个子元素(Element)  
  
   objNodeChild As XmlNode  
  
   objNodeChild = objDoc.CreateElement(Nothing, "ID", Nothing)  
  
   objNodeChild.InnerXml = "101"  
  
   objNode.AppendChild(objNodeChild)  
  
   3.4 删除一个子元素  
  
   objNode.RemoveChild(objNodeChild)  
  
   3.5 替换一个子元素  
  
   objNOde.ReplaceChild(newChild,oldChild)  
  
    



猜你喜欢

转载自blog.csdn.net/lei_7103/article/details/76974606
今日推荐