【Unity】xml文件讀取

之前做了一個用csv存取對話讀檔的系統,但是最近要用到大量的事件表
發現用csv會一大堆空格,不夠彈性,所以又跑回去以前不怎麼喜歡的xml格式
一開始想說xml好麻煩還要學,才跑去用csv比較直覺的
結果最近幾天看才發現,嗯?! 完全不會到入門其實蠻短的

這是一份簡單的xml檔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>  
<DailyEvent>
<Day id="1">
<Event>
event1
</Event>
<Dialog>
"第一天"
</Dialog>
</Day>
<Day id="2">
<Event>
event2
</Event>
<Dialog>
"第二天"
</Dialog>
</Day>
</DailyEvent>

從外到內分別為

宣告xml的資訊

1
<?xml version="1.0" encoding="utf-8"?>

通常出現在XML文件的第一行,可寫可不寫
如果宣告了,version是必要寫上去的,然後後面的encoding則是選填
宣告了之後就可識別使用哪個編碼來代表文件中的字元了
像是使用日文編碼就是↓

1
<?xml version="1.0" encoding="Shift-JIS"?>

先進後出

格式很像html那樣的寫法
基本上就是< >跟</ > 成雙成對出現
並且回文,意思就是先進後出,先寫的< >,最後再用</ >把它封起來
像上面的 < DailyEvent> 一開始就寫了,如果裡面還要用別的<>就先擱著,如果沒有其他要寫的標籤,就可以封起來了
用文字表達就是

1
<1> <2> </2></1>

的感覺

樹狀結構

就跟樹一樣,只會有一個Root(父節點),指的就是上面範例的DailyEvent
不會有其他的Root了,然後再用這個Root去往下延伸
上面範例的第一個子節點是

1
<Day id="1">

同階層的另外一個子節點就是

1
<Day id="2">

而這兩個子節點又分別有兩個子節點

那資料就是可以儲存在某個節點的 <> 與 </> 中間那段空白,就像上面寫的第一天,第二天那樣

屬性

<>內可以填屬性,像是

1
<Day id="1">

id=”1”,就是他的屬性,在unity內等等會用到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml.Linq;
using System;
public class ReadXML : MonoBehaviour {
public string id;
public string eventContent;
public string DialogContent;

void Start () {

var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Element("DailyEvent").Elements("Day");

foreach (var day in AllDays)
{
id = day.Attribute("id").Value.Trim();// 屬性
eventContent = day.Element("Event").Value.Trim(); // 內容
DialogContent = day.Element("Dialog").Value.Trim(); //也是內容

Debug.Log("day ID = " + id);
Debug.Log("eventContent" + eventContent);
Debug.Log("DialogContent" + DialogContent);

}
}

}

在Unity要讀取到xml檔案有兩種方法

一種是以前的XmlDocument
因為我用的不是這種的,所以這邊就先跳過了
有興趣的參考以下網頁

XML的簡單讀取與寫入
XML檔案基本操作-XmlDocument

第二種是比較新的XDocuments
可以用比較直覺地去讀取xml中的資料

要使用前先加入標頭檔

1
using System.Xml.Linq;

接下來就是開起xml檔了
先把輸入好的xml丟到unity內的Asset資料夾裡面,我是直接丟外面,當然也可以創建資料夾放到裡面,以下示範直接丟在外面的方式

1
XDocument AllDays = XDocument.Load("Assets/DailyEvent_1.xml");

那讀取完之後就是拿取裡面資料了
首先要先獲得它的節點
獲取節點有兩種方法
一種是你有很多個節點,使用的就是
根節點.Elements(“XXXX”);
另外一種就是只有單一節點
根節點.Element(“XXXX”);
基本上兩種方法就可以獲取到不同深度的節點了

拿取節點後要獲取內容的話就在後面.value就能拿到<與 >之間的值了

拿取根節點的時候有比較步驟的方法,以下兩行都是相等的

1
2
var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Element("DailyEvent");
var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Root;

然後還有讀取節點的屬性

1
day.Attribute("id").Value

然後大致上就可以使用啦~ 還蠻直覺的