Unity UnityでXMLファイルを読んでみた話
あいさつ
どうも、はかせです。
最近Unityを使って通信をやってみたりしてます。
その中で色々WebAPIを叩いてみたんですが、
返ってくるものは大体XMLかJsonでした。
XML読み込みはC++で散々悪戦苦闘した(している)ものです。
そのXMLファイルをUnityで読んでみようというのが今回のテーマです。
UnityでXMLを読む方法
UnityというかC#.Netで読み込む形になりますね。
C#にはXMLを読み込む機能が標準で何個か入っています。
今回はその中でもLinqに対応しているということで
XDocumentを使ってみます。
まずは素直に使ってみます。
とりあえずXDocument.Parseに読みたいXMLをstringで渡せばいいみたいです。
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; public class TestXML : MonoBehaviour { public TextAsset mXmlText; // Start is called before the first frame update void Start() { try { System.Xml.Linq.XDocument xml = System.Xml.Linq.XDocument.Parse(mXmlText.text); foreach (var data in xml.Root.Descendants()) { print("Name:" + data.Name.LocalName + "Value:" + data.Value); } } catch (System.Exception e) { print("データ読み込み失敗" + e); } } }
Rootはルートノードを、
Descendantsは対象ノードの子ノードを
IEnumerable<>を返してくれるそうです。
それにしても、
こんな簡単にXMLを読み込むことができるんですかね・・?
過去の経験上こういったものが
一回でうまくいった試しがないんですが・・・・
嘘だろ・・?
私があんだけC++で
あーでもないこーでもないとやっていたものがこんなにあっさりと・・・
C#は強い(語彙力崩壊)
Linqも使ってみる
まぁ苦労することなくXMLが読めたので
(私の想定では読むだけで相当苦労するはずだったのに)
XDocument選択理由でもあるLinqでも使ってみましょうか。
さっきの実行結果を見る感じだと大きなタグである
personタグのValueが子要素のValue全部入ってて見づらかったです。
personタグは大きく分けるためのタグで中身はその中のタグで設定するので
personタグのValueは表示する必要がありません。
というわけでpersonタグのつまみだしをLinqでやってみます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; public class TestXML : MonoBehaviour { public TextAsset mXmlText; // Start is called before the first frame update void Start() { try { System.Xml.Linq.XDocument xml = System.Xml.Linq.XDocument.Parse(mXmlText.text); //personタグはあっちいけ foreach (var data in xml.Root.Descendants().Where(value => value.Name.LocalName != "person")) { print("Name:" + data.Name.LocalName + "Value:" + data.Value); } } catch (System.Exception e) { print("データ読み込み失敗" + e); } } }
さてpersonタグはつまみだせているんでしょうか?
C#は強い(二回目)
Linqでデータ操作もできるとか神過ぎん・・?
C++のプロジェクトで使うツールもC#で作ろうかな・・・