今天在工作之余學習了一下關於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 }