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

基本上我是以另一種方式再解釋一次

首先了解一下檔案放置的位置
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"中找到

接下來開始說明如何建立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);

-------------------------------------------------------
output結果:
<Projects>
        <project>
                <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);
-------------------------------------------------------
新的節點會順序加下去
        <project>
                <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>
        <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屬性: TextCanvasImage等等,也是屬於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 = "+"
2= "="
3="?????"


@"\d+\" 的意思是去掉所有的數字
@"   "
是最外層的格式,裡面才是規則
\d
的意思就去掉數字, 後面的 "+" 符號是 進行多次程序,不使用"+"就不能清除所有的數字了。

詳細的規則表請自行查找" RegularExpressions",這裡只作初步介紹。

最後歡迎各位路過的路人甲發問/ 提供更好的方法,互相交流。

留言

這個網誌中的熱門文章

21-5-2021 時空之門CrossGate/魔力寶貝 主線 劇情 - 4000年輪迴的終結

2020-6-19 《XENOBLADE異度神劍》- 善意地阻止你踩雷

2019-10-21 《Dragon Quest勇者鬥惡龍XI S》 評測 - 平淡而完滿