NEIL的Unity學習筆記(5) - XML 寫入 和 二三事
XML 寫入 和 二三事
應朋友要求幫忙寫了一個記帳用的手機程式,慣例順道來分享箇中經驗。
XML mini Accounting
https://play.google.com/store/apps/details?id=com.CF.XmlminiAccount
首先非常感謝雨松MOMO的文章
http://www.xuanyusong.com/archives/1901
基本上我是以另一種方式再解釋一次
http://www.xuanyusong.com/archives/1901
基本上我是以另一種方式再解釋一次
首先了解一下檔案放置的位置
public static string filepath = Application.dataPath + @"/StreamingAssets/my.xml";
public static string filepath = Application.dataPath + @"/StreamingAssets/my.xml";
public static string filepath =
Application.persistentDataPath+"/my.xml";// for android
要讓手機裝置可以找到被unity所建立的檔案,必需要設定 file> build setting>player setting>other settings>configuration> write Access 設定為external(SD card), 那檔案可以使用你手機的檔案管理員於"Android/data/app/com.yourappname/files"中找到
要讓手機裝置可以找到被unity所建立的檔案,必需要設定 file> build setting>player setting>other settings>configuration> write Access 設定為external(SD card), 那檔案可以使用你手機的檔案管理員於"Android/data/app/com.yourappname/files"中找到
接下來開始說明如何建立XML檔案
首先載入要使用的資料庫
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.IO;
using System.Text;
------------------------------------------------------------------------
//定義xmlDoc 為 XmlDocument() 設定的屬性(就是xml).
XmlDocument xmlDoc = new XmlDocument();
//建立root node"節點",也就是最上層節點
XmlElement root =
xmlDoc.CreateElement("Projects");
//建立下一層node
XmlElement elmNew =
xmlDoc.CreateElement("project");
//設定node的兩個属性 ID 和 NAME
//繼續建立下一層節點
XmlElement Name = xmlDoc.CreateElement("Name");
Name.InnerText = "DefaultName";
XmlElement item1 = xmlDoc.CreateElement("item1");
item1.InnerText = "0";
XmlElement item2 = xmlDoc.CreateElement("item2");
item2.InnerText = "0";
XmlElement item3 = xmlDoc.CreateElement("item3");
item3.InnerText = "0";
XmlElement item4 = xmlDoc.CreateElement("item4");
item4.InnerText = "0";
XmlElement item5 = xmlDoc.CreateElement("item5");
item5.InnerText = "0";
XmlElement Total = xmlDoc.CreateElement("Total");
item5.InnerText = "0";
//把node順序地寫入至XMLDoc中
elmNew.AppendChild(ID);
elmNew.AppendChild(Name);
elmNew.AppendChild(item1);
elmNew.AppendChild(item2);
elmNew.AppendChild(item3);
elmNew.AppendChild(item4);
elmNew.AppendChild(item5);
elmNew.AppendChild(Total);
//可以在一個節點增加屬性,用來區分。
//Total.SetAttribute("id",
"1");
root.AppendChild(elmNew);
//把root 在最後添加,如關上括號一樣
//root.SetAttribute("count",projectCount.ToString());
xmlDoc.AppendChild(root);
//把XML文件保存在設定的路徑
xmlDoc.Save(filepath);
-------------------------------------------------------
<ID>1</ID>
<Name>p1</Name>
<Item1>0</Item1>
<Item2>0</Item2>
<Item3>0</Item3>
<Item4>0</Item4>
<Item5>0</Item5>
<Total>0</Total>
</project>
</Projects>
如果使用SetAttribute(); 如 Total. SetAttribute("id",
"1");
<Total id
="1">0</Total>
節點的名稱不會因為增加屬性而改變
而想增加更多屬性只要寫兩次就可以了
Total. SetAttribute("id",
"1");
Total. SetAttribute("name",
"Temp");
--------------------------------------------------------
在已存在的文件中增加節點
---------------------------------------
---------------------------------------
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filepath);// 注意這次是載入
XmlNode root =
xmlDoc.SelectSingleNode("Projects");//使用SelectSingleNode 來選擇Root目錄
//下面依舊
XmlElement elmNew =
xmlDoc.CreateElement("project");
XmlElement ID =
xmlDoc.CreateElement("ID");
ID.InnerText = projectCount.ToString();
XmlElement Name =
xmlDoc.CreateElement("Name");
Name.InnerText = ram_projectName;
XmlElement item1 =
xmlDoc.CreateElement(ram_item1);
item1.InnerText = item1value.ToString();
XmlElement item2 =
xmlDoc.CreateElement(ram_item2);
item2.InnerText = item2value.ToString();
XmlElement item3 =
xmlDoc.CreateElement(ram_item3);
item3.InnerText = item3value.ToString();
XmlElement item4 =
xmlDoc.CreateElement(ram_item4);
item4.InnerText = item4value.ToString();
XmlElement item5 =
xmlDoc.CreateElement(ram_item5);
item5.InnerText = item5value.ToString();
XmlElement Total =
xmlDoc.CreateElement("Total");
itemTotal =
item1value + item2value + item3value + item4value + item5value;
Total.InnerText = itemTotal.ToString();
elmNew.AppendChild(ID);
elmNew.AppendChild(Name);
elmNew.AppendChild(item1);
elmNew.AppendChild(item2);
elmNew.AppendChild(item3);
elmNew.AppendChild(item4);
elmNew.AppendChild(item5);
elmNew.AppendChild(Total);
root.AppendChild(elmNew);
xmlDoc.AppendChild(root);
xmlDoc.Save(filepath);
-------------------------------------------------------
新的節點會順序加下去
<ID>1</ID>
<Name>p1</Name>
<Item1>0</Item1>
<Item2>0</Item2>
<Item3>0</Item3>
<Item4>0</Item4>
<Item5>0</Item5>
<Total>0</Total>
</project>
<ID>2</ID>
<Name>p2</Name>
<Item1>0</Item1>
<Item2>0</Item2>
<Item3>0</Item3>
<Item4>0</Item4>
<Item5>0</Item5>
<Total>0</Total>
</project>
---------------------------------------------------------------------------------
雖然unity有提供生成XML的功能,但好像沒有找到可以刪除XML檔案的功能,一般所謂的刪除其實只是把整個XML清空,留下ROOT node。
XmlNode root =
xmlDoc.SelectSingleNode("Projects");
root.RemoveAll();
------------------------------------------------------------------
二三事:
有時候想使用GameObject.Find() 去抓UI物件,但不想指定為GameObject。這時候可以這樣寫:
Text _T = OB.GetComponentInChildren<Text>() as Text;
因為UI屬性: Text、Canvas、Image等等,也是屬於component。
Text _T = OB.GetComponentInChildren<Text>() as Text;
因為UI屬性: Text、Canvas、Image等等,也是屬於component。
使Regex()去掉你不想要的文字
首先要載入涵數庫
using System.Text.RegularExpressions;
//定義要使用的"規則"
string ram ="12345+45678=?????"
string pattern = @"\d+";
//定義regex 跟使用"規則"
Regex rgx = new Regex(pattern);
string[] result = rgx.Split(ram);
output:
1 = "+"
1 = "+"
2= "="
3="?????"
@"\d+\" 的意思是去掉所有的數字
@" " 是最外層的格式,裡面才是規則
\d 的意思就去掉數字, 後面的 "+" 符號是 進行多次程序,不使用"+"就不能清除所有的數字了。
詳細的規則表請自行查找" RegularExpressions",這裡只作初步介紹。
最後歡迎各位路過的路人甲發問/ 提供更好的方法,互相交流。
@" " 是最外層的格式,裡面才是規則
\d 的意思就去掉數字, 後面的 "+" 符號是 進行多次程序,不使用"+"就不能清除所有的數字了。
詳細的規則表請自行查找" RegularExpressions",這裡只作初步介紹。
最後歡迎各位路過的路人甲發問/ 提供更好的方法,互相交流。
留言
張貼留言