,

【Unity】xml文件讀取

之前做了一個用csv存取對話讀檔的系統,但是最近要用到大量的事件表

發現用csv會一大堆空格,不夠彈性,所以又跑回去以前不怎麼喜歡的xml格式

一開始想說xml好麻煩還要學,才跑去用csv比較直覺的

結果最近幾天看才發現,嗯?! 完全不會到入門其實蠻短的

保存用:
http://stanleyhlng.com/prettify-js/

https://rawgit.com/
========

<?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則是選填
宣告了之後就可識別使用哪個編碼來代表文件中的字元了
像是
<?xml version="1.0" encoding="Shift-JIS"?>
就是使用日文編碼

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


3.樹狀結構
就跟樹一樣,只會有一個Root(父節點),指的就是上面範例的DailyEvent
不會有其他的Root了,然後再用這個Root去往下延伸
上面範例的第一個子節點是
<Day id="1">
同階層的另外一個子節點就是
<Day id="2">
而這兩個子節點又分別有兩個子節點

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

4.屬性
<>內可以填屬性,像是上面
<Day id="1">
內的 id="1",就是他的屬性,在unity內等等會用到


====

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中的資料

要使用前先加入標頭檔
using System.Xml.Linq;

接下來就是開起xml檔了
先把輸入好的xml丟到unity內的Asset資料夾裡面,我是直接丟外面,當然也可以創建資料夾放到裡面,以下示範直接丟在外面的方式
XDocument AllDays = XDocument.Load("Assets/DailyEvent_1.xml");

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

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


拿取根節點的時候有比較步驟的方法,以下兩行都是相等的
 var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Element("DailyEvent");
 var AllDays = XDocument.Load("Assets/DailyEvent_1.xml").Root;

然後還有讀取節點的屬性
day.Attribute("id").Value

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



Share:

沒有留言:

張貼留言