Unity3D_08_XML文件创建,读取,修改,添加
Unity3D_08_XML文件创建,读取,修改,添加
本文转载:https://www.cnblogs.com/NBOWeb/p/8968036.html
今天在工作之余学习了一下关于Unity中关于XML的部分。
在这里要注意添加两个命名空间,如下:
一、xml的解析
首先新建一个xml,可以命名为item.xml,拖进assets里面,内容如下:
1 <item> 2 <item1> 3 <id>1</id> 4 <name>china</name> 5 <year>2016</year> 6 </item1> 7 <item2> 8 <id>2</id> 9 <name>usa</name> 10 <year>2017</year> 11 </item2> 12 </item>
通过这个xml来解析。然后写一个.cs文件,注意需要导入这两个头文件
1 using System.Xml; //xml操作 2 using System.IO; //file操作
一个是对XML文件的命名空间,里面有关xml的很多api;
一个是对文件读写的命名空间,是对文件的读取,保存操作;
解析函数如下:
1 //解析xml 2 void parseXml(){ 3 //也可以前面加上@,区别就是有@的话,双引号里面的内容不转义,比如" \" " 4 //string filePath = Application.dataPath+@"/Resources/item.xml"; 5 string filePath = Application.dataPath+"/Resources/item.xml"; 6 if(File.Exists(filePath)){ 7 XmlDocument xmlDoc = new XmlDocument(); 8 xmlDoc.Load(filePath); 9 XmlNodeList node = xmlDoc.SelectSingleNode("item").ChildNodes; 10 //遍历节点 11 foreach(XmlElement ele in node){ 12 //item下面的节点 13 Debug.Log(ele.Name); 14 15 if(ele.Name == "item1"){ 16 //first item1 17 foreach(XmlElement i1 in ele.ChildNodes){ 18 Debug.Log(i1.Name); 19 if(i1.Name == "id"){ 20 id1 = i1.InnerText; 21 } 22 if(i1.Name == "name"){ 23 name1 = i1.InnerText; 24 } 25 if(i1.Name=="year"){ 26 year1 = i1.InnerText; 27 } 28 } 29 } 30 if(ele.Name == "item2"){ 31 //first item1 32 foreach(XmlElement i2 in ele.ChildNodes){ 33 Debug.Log(i2.Name); 34 if(i2.Name == "id"){ 35 id2 = i2.InnerText; 36 } 37 if(i2.Name == "name"){ 38 name2 = i2.InnerText; 39 } 40 if(i2.Name=="year"){ 41 year2 = i2.InnerText; 42 } 43 } 44 } 45 46 } 47 } 48 Debug.Log("id1: "+id1); 49 Debug.Log("name1: "+name1); 50 Debug.Log("year1: "+year1); 51 Debug.Log("id2: "+id2); 52 Debug.Log("name2: "+name2); 53 Debug.Log("year2: "+year2); 54 }
通过解析即可得到xml的值
后面的增删改其实不怎么用,因为一般都是策划直接修改表,而不用代码修改,但是还是可以看看。
二:XML文件创建、读取、修改、添加
代码如下:
1 using UnityEngine; 2 using System.Collections; 3 using System.Xml; 4 using System.IO; 5 6 public class XMLDemo : MonoBehaviour { 7 private ArrayList Adialogue = new ArrayList(); 8 private ArrayList Bdialogue = new ArrayList(); 9 private ArrayList textList = new ArrayList(); 10 // Use this for initialization 11 void Start () { 12 13 14 } 15 16 // Update is called once per frame 17 void Update () { 18 19 } 20 21 void OnGUI() { 22 if (GUI.Button(new Rect(50, 50, 100, 50), "生成XML")) 23 { 24 CreateXML(); 25 Debug.Log("生成XML"); 26 } 27 28 if (GUI.Button(new Rect(50, 100, 100, 50), "读取XML")) 29 { 30 LoadXml(); 31 Debug.Log("读取XML"); 32 } 33 34 if (GUI.Button(new Rect(50, 150, 100, 50), "修改XML")) 35 { 36 updateXML(); 37 Debug.Log("修改XML"); 38 39 } 40 41 if (GUI.Button(new Rect(50, 200, 100, 50), "增加XML节点")) 42 { 43 addXMLData(); 44 Debug.Log("增加XML"); 45 } 46 } 47 48 //创建XML 49 void CreateXML() 50 { 51 string path = Application.dataPath + "/data2.xml"; 52 if (!File.Exists(path)) 53 { 54 //创建最上一层的节点。 55 XmlDocument xml = new XmlDocument(); 56 //创建最上一层的节点。 57 XmlElement root = xml.CreateElement("objects"); 58 //创建子节点 59 XmlElement element = xml.CreateElement("messages"); 60 //设置节点的属性 61 element.SetAttribute("id", "1"); 62 XmlElement elementChild1 = xml.CreateElement("contents"); 63 64 elementChild1.SetAttribute("name", "a"); 65 //设置节点内面的内容 66 elementChild1.InnerText = "这就是你,你就是天狼"; 67 XmlElement elementChild2 = xml.CreateElement("mission"); 68 elementChild2.SetAttribute("map", "abc"); 69 elementChild2.InnerText = "去吧,少年,去实现你的梦想"; 70 //把节点一层一层的添加至xml中,注意他们之间的先后顺序,这是生成XML文件的顺序 71 element.AppendChild(elementChild1); 72 element.AppendChild(elementChild2); 73 root.AppendChild(element); 74 xml.AppendChild(root); 75 //最后保存文件 76 xml.Save(path); 77 } 78 } 79 80 //读取XML 81 void LoadXml() 82 { 83 //创建xml文档 84 XmlDocument xml = new XmlDocument(); 85 86 xml.Load(Application.dataPath + "/data2.xml"); 87 //得到objects节点下的所有子节点 88 XmlNodeList xmlNodeList = xml.SelectSingleNode("objects").ChildNodes; 89 //遍历所有子节点 90 foreach (XmlElement xl1 in xmlNodeList) 91 { 92 93 if (xl1.GetAttribute("id") == "1") 94 { 95 //继续遍历id为1的节点下的子节点 96 foreach (XmlElement xl2 in xl1.ChildNodes) 97 { 98 //放到一个textlist文本里 99 //textList.Add(xl2.GetAttribute("name") + ": " + xl2.InnerText); 100 //得到name为a的节点里的内容。放到TextList里 101 if (xl2.GetAttribute("name") == "a") 102 { 103 Adialogue.Add(xl2.GetAttribute("name") + ": " + xl2.InnerText); 104 print("******************"+ xl2.GetAttribute("name") + ": " + xl2.InnerText); 105 } 106 //得到name为b的节点里的内容。放到TextList里 107 else if (xl2.GetAttribute("map") == "abc") 108 { 109 Bdialogue.Add(xl2.GetAttribute("name") + ": " + xl2.InnerText); 110 print("******************" + xl2.GetAttribute("name") + ": " + xl2.InnerText); 111 } 112 } 113 } 114 } 115 print(xml.OuterXml); 116 } 117 118 //修改XML 119 void updateXML() 120 { 121 string path = Application.dataPath + "/data2.xml"; 122 if (File.Exists(path)) 123 { 124 XmlDocument xml = new XmlDocument(); 125 xml.Load(path); 126 XmlNodeList xmlNodeList = xml.SelectSingleNode("objects").ChildNodes; 127 foreach (XmlElement xl1 in xmlNodeList) 128 { 129 if (xl1.GetAttribute("id") == "1") 130 { 131 //把messages里id为1的属性改为5 132 xl1.SetAttribute("id", "5"); 133 } 134 135 if (xl1.GetAttribute("id") == "2") 136 { 137 foreach (XmlElement xl2 in xl1.ChildNodes) 138 { 139 if (xl2.GetAttribute("map") == "abc") 140 { 141 //把mission里map为abc的属性改为df,并修改其里面的内容 142 xl2.SetAttribute("map", "df"); 143 xl2.InnerText = "我成功改变了你"; 144 } 145 146 } 147 } 148 } 149 xml.Save(path); 150 } 151 } 152 153 //添加XML 154 void addXMLData() 155 { 156 string path = Application.dataPath + "/data2.xml"; 157 if (File.Exists(path)) 158 { 159 XmlDocument xml = new XmlDocument(); 160 xml.Load(path); 161 XmlNode root = xml.SelectSingleNode("objects"); 162 //下面的东西就跟上面创建xml元素是一样的。我们把他复制过来就行了 163 XmlElement element = xml.CreateElement("messages"); 164 //设置节点的属性 165 element.SetAttribute("id", "2"); 166 XmlElement elementChild1 = xml.CreateElement("contents"); 167 168 elementChild1.SetAttribute("name", "b"); 169 //设置节点内面的内容 170 elementChild1.InnerText = "天狼,你的梦想就是。。。。。"; 171 XmlElement elementChild2 = xml.CreateElement("mission"); 172 elementChild2.SetAttribute("map", "def"); 173 elementChild2.InnerText = "我要妹子。。。。。。。。。。"; 174 //把节点一层一层的添加至xml中,注意他们之间的先后顺序,这是生成XML文件的顺序 175 element.AppendChild(elementChild1); 176 element.AppendChild(elementChild2); 177 178 root.AppendChild(element); 179 180 xml.AppendChild(root); 181 //最后保存文件 182 xml.Save(path); 183 } 184 }