はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity UnityでXMLファイルを読んでみた話

あいさつ

どうも、はかせです。
最近Unityを使って通信をやってみたりしてます。
その中で色々WebAPIを叩いてみたんですが、
返ってくるものは大体XMLJsonでした。

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を読み込むことができるんですかね・・?
過去の経験上こういったものが
一回でうまくいった試しがないんですが・・・・
f:id:hakase0274:20190731231517p:plain

嘘だろ・・?
私があんだけ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タグはつまみだせているんでしょうか?
f:id:hakase0274:20190731232311p:plain
C#は強い(二回目)
Linqでデータ操作もできるとか神過ぎん・・?
C++のプロジェクトで使うツールもC#で作ろうかな・・・

あとがき

今回はUnityというかC#でのXML読み込みでした。
かなり楽に読めて、かなり楽に操作できるので
今までC++で変に苦労していたのは何だったんだという気持ちになりましたw

データ管理とかゲームのランタイムで走る必要もないですし、
C++にこだわらなくてもいいのかもしれませんね。

それでは今回はこの辺でノシ