XmlDocumentを使ったXMLパース方法の続き。Unity Noobs: XML - Loading data from a xml file.のスクリプトが良い参考になるので、これを解読してみる。
サンプルのXMLは次。
<levels>
<level>
<name>Level 1 (xml)</name>
<tutorial>Try comes close to all four objects. (xml)</tutorial>
<object name="Cube"> Hi, I'm a cube! (xml) </object>
<object name="Cylinder"> Hi, I'm a Cylinder! (xml) </object>
<object name="Capsule"> Hi, I'm a Capsule! (xml) </object>
<object name="Sphere"> Hi, I'm a Sphere! (xml)</object>
<finaltext>Very Good! (xml)</finaltext>
</level>
<level>
<name>Level 2 (xml)</name>
<tutorial>Try comes close to all four objects, again. (xml)</tutorial>
<object name="Cube"> Hi, I'm a cube in the level 2! (xml)</object>
<object name="Cylinder"> Hi, I'm a Cylinder in the level 2! (xml)</object>
<object name="Capsule"> Hi, I'm a Capsule in the level 2! (xml)</object>
<object name="Sphere"> Hi, I'm a Sphere in the level 2! (xml)</object>
<finaltext>Congratulations! (xml)</finaltext>
</level>
</levels>
これに対して次のスクリプトがある。(注:C#で記述されているので、javascript派は読み替えてください。)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;
public class LoadXmlData : MonoBehaviour // the Class
{
public TextAsset GameAsset;
static string Cube_Character = "";
static string Cylinder_Character = "";
static string Capsule_Character = "";
static string Sphere_Character = "";
List<Dictionary<string,string>> levels = new List<Dictionary<string,string>>();
Dictionary<string,string> obj;
void Start()
{ //Timeline of the Level creator
GetLevel();
}
public void GetLevel()
{
XmlDocument xmlDoc = new XmlDocument(); // xmlDoc is the new xml document.
xmlDoc.LoadXml(GameAsset.text); // load the file.
XmlNodeList levelsList = xmlDoc.GetElementsByTagName("level"); // array of the level nodes.
foreach (XmlNode levelInfo in levelsList)
{
XmlNodeList levelcontent = levelInfo.ChildNodes;
obj = new Dictionary<string,string>(); // Create a object(Dictionary) to colect the both nodes inside the level node and then put into levels[] array.
foreach (XmlNode levelsItens in levelcontent) // levels itens nodes.
{
if(levelsItens.Name == "name")
{
obj.Add("name",levelsItens.InnerText); // put this in the dictionary.
}
if(levelsItens.Name == "tutorial")
{
obj.Add("tutorial",levelsItens.InnerText); // put this in the dictionary.
}
if(levelsItens.Name == "object")
{
switch(levelsItens.Attributes["name"].Value)
{
case "Cube": obj.Add("Cube",levelsItens.InnerText);break; // put this in the dictionary.
case "Cylinder":obj.Add("Cylinder",levelsItens.InnerText); break; // put this in the dictionary.
case "Capsule":obj.Add("Capsule",levelsItens.InnerText); break; // put this in the dictionary.
case "Sphere": obj.Add("Sphere",levelsItens.InnerText);break; // put this in the dictionary.
}
}
if(levelsItens.Name == "finaltext")
{
obj.Add("finaltext",levelsItens.InnerText); // put this in the dictionary.
}
}
levels.Add(obj); // add whole obj dictionary in the levels[].
}
}
}XmlDocumentファミリーを使う際の肝は次の通り。(注:僕はjavascript派なので、javascriptに書き換えている)
1)XMLを読み込む
xmlDoc:XmlDocument = new XmlDocument(); xmlDoc.LoadXml(GameAsset.text);
2)"lavel"と言う名前のタグのみ抜き出したXmlList(Array)を作る。
levelsList: XmlNodeList = xmlDoc.GetElementsByTagName("level"); ちなみにタグ名ではなく、num番目(0,1,2,...)の要素を取り出すには、
levelsList: XmlNodeList = xmlDoc.GetElementsById(num);
とする。
3)XmlList("levelList")から、要素であるXmlNodeをひとつずつ取り出す。
(注:javascriptでは’foreach'は使えないので'for'で代用。'var'が必要なことも注意)
for (var levelInfo:XmlNode in levelsList){4)XmlNodeから子ノードのXmlListを作る。
levelcontent:XmlNodeList = levelInfo.ChildNodes;
5)XmlNodeのタグ名は、'XmlNode名.Name'で取得。
if(levelsItens.Name == "name")
6)XmlNodeのテキストは、'XmlNode名.InnerText'で取得。
obj.Add("name",levelsItens.InnerText);7)XmlNodeのアトリビュートは、'XmlNode名.Attributes["アトリビュート名"].Value'で取得。
switch(levelsItens.Attributes["name"].Value)