XML文件读取

总结
1.读取XML文件
XmlDocument xml = new XmlDocument();
读取文本方式1-xml.LoadXml(传入xml文本字符串)
读取文本方式2-xml.Load(传入路径)

2.读取元素和属性
获取单个节点 : XmlNode node = xml.SelectSingleNode(节点名)
获取多个节点 : XmlNodeList nodeList = xml.SelectNodes(节点名)

获取节点元素内容:node.InnerText
获取节点元素属性:
1.item.Attributes["属性名"].Value
2.item.Attributes.GetNamedItem("属性名").Value

通过迭代器遍历或者循环遍历XmlNodeList对象 可以获取到各单个元素节点

代码

using System.Collections;
using System.Collections.Generic;
using System.Xml;
using UnityEngine;

public class LoadXml : MonoBehaviour
{
    void Start()
    {
        //1.使用Resources提取出的资源,得到xml的text并进行加载
        XmlDocument xml = new XmlDocument();
        TextAsset asset = Resources.Load<TextAsset>("TestXml");
        //print(asset.text);
        //loadxml 直接翻译字符串为xml
        xml.LoadXml(asset.text);
        //2.直接通过xml的路径加载
        //xml.Load(Application.streamingAssetsPath + "/TestXml.xml");


        //节点信息类
        //XmlNode 单个节点信息
        //XmlNodeList 多个节点信息类
        XmlNode root = xml.SelectSingleNode("Root");
        //通过根节点找子节点
        XmlNode nodeName = root.SelectSingleNode("name");
        //得到个子节点通过 InnerText读取里面的内容
        print(nodeName.InnerText);
        XmlNode nodeAge = root.SelectSingleNode("age");
        print(nodeAge.InnerText);

        XmlNode nodeItem = root.SelectSingleNode("Item");
        //得到带属性的节点内容
        //第一种
        print(nodeItem.Attributes["id"].Value);
        print(nodeItem.Attributes["num"].Value);
        //第二种(了解)
        print(nodeItem.Attributes.GetNamedItem("id").Value);

        //获取一个节点下 所有同名节点的方式
        XmlNodeList friendList = root.SelectNodes("Friend");
        //遍历方式1:迭代器遍历
        foreach (XmlNode item in friendList)
        {
            print(item.SelectSingleNode("id").Value);
            print(item.SelectSingleNode("name").Value);
        }

        //遍历方式2:for循环
        for (int i = 0; i < friendList.Count; i++)
        {
            print(friendList[i].SelectSingleNode("id").Value);
            print(friendList[i].SelectSingleNode("name").Value);
        }
    }
}

在playerInfo类中写一个加载xml数据的LoadData()函数

用于解析一个xml文件并将内容赋予到一个新的playerInfo上去

using System.Collections;
using System.Collections.Generic;
using System.Xml;
using UnityEngine;

public class Item
{
    public int id;
    public int num;
}

public class playerInfo
{
    public string name;
    public int atk;
    public int def;
    public float moveSpeed;
    public float roundSpeed;
    public Item weapon;
    public List<int> listInt;
    public List<Item> itemList;
    public Dictionary<int, Item> itemDic;

    public void LoadData(string fileName)
    {
        //加载XML文件信息
        XmlDocument xml = new XmlDocument();
        //加载
        xml.Load(Application.streamingAssetsPath + "/" + fileName + ".xml");

        //从文件中加载出具体的数据
        //加载根节点 才能加载后面的内容
        XmlNode playerInfo = xml.SelectSingleNode("PlayerInfo");
        //通过根节点 去加载具体的信息
        //不是属性的化用 InnerText 属性的化用Attributes
        this.name = playerInfo.SelectSingleNode("name").InnerText;
        this.atk = int.Parse(playerInfo.SelectSingleNode("atk").InnerText);
        this.def = int.Parse(playerInfo.SelectSingleNode("def").InnerText);
        this.moveSpeed = float.Parse(playerInfo.SelectSingleNode("moveSpeed").InnerText);
        this.roundSpeed = float.Parse(playerInfo.SelectSingleNode("roundSpeed").InnerText);

        XmlNode weaponNode = playerInfo.SelectSingleNode("weapon");
        //实例化不能忘记
        this.weapon = new Item();
        this.weapon.id = int.Parse(weaponNode.SelectSingleNode("id").InnerText);
        this.weapon.num = int.Parse(weaponNode.SelectSingleNode("num").InnerText);

        XmlNode listIntNode = playerInfo.SelectSingleNode("listInt");
        XmlNodeList intList = listIntNode.SelectNodes("int");
        this.listInt = new List<int>();
        for (int i = 0; i < intList.Count; i++)
        {
            this.listInt.Add(int.Parse(intList[i].InnerText));
        }

        XmlNode itemList = playerInfo.SelectSingleNode("itemList");
        XmlNodeList items = itemList.SelectNodes("Item");
        this.itemList = new List<Item>();
        //对单一类别的节点 用 foreach和for都可以
        foreach (XmlNode item in items)
        {
            Item item2 = new Item();
            item2.id = int.Parse(item.Attributes["id"].Value);
            item2.num = int.Parse(item.Attributes["num"].Value);
            this.itemList.Add(item2);
        }

        XmlNode itemDic = playerInfo.SelectSingleNode("itemDic");
        XmlNodeList keyInt = itemDic.SelectNodes("int");
        XmlNodeList valueItem = itemDic.SelectNodes("Item");

        this.itemDic = new Dictionary<int, Item>();
        for (int i = 0; i < keyInt.Count; i++)
        {
            int key = int.Parse(keyInt[i].InnerText);
            Item item1 = new Item();
            item1.id = int.Parse(valueItem[i].Attributes["id"].Value);
            item1.num = int.Parse(valueItem[i].Attributes["num"].Value);
            this.itemDic.Add(key, item1);
        }
    }
}

测试

    void Start()
    {
        playerInfo p = new playerInfo();
        p.LoadData("PlayerInfo");
    }