XML介绍

简介

  • XML是一种可扩展标记语言(Extensible Markup Language)
  • 类似于 HTML,都是标签(标记)语言。
  • 在软件开发的各个领域(Web,Android,IOS,Game,EXE...)都可以看到 XML 文件的身影。
  • XML被设计用来传输和存储数据,而非显示数据
  • XML本身就是一个存储的文本
  • 是独立于软件和硬件的信息传输工具。

XML与HTML的主要差异

  • XML 不是 HTML 的替代
  • XML 和 HTML 为不同的目的而设计
  • XML 被设计为传输和存储数据,其焦点是数据的内容
  • HTML 被设计用来显示数据,其焦点是数据的外观
  • HTML 旨在显示信息,而 XML 旨在传输信息

语法结构

  • XML 文档的语法结构实际上是一个树状结构。
  • 主要组成部分:根元素,子元素,属性,文本。
<!-- Web是根节点(root) -->
<Web>
    <!-- Item是子元素/节点(ChildNodes),id是属性(Attributes) -->
	<Item id="1">
		<!-- “百度”是文本(InnerText) -->
        <name>百度</name>
		<url>www.baidu.com</url>
	</Item>
  
	<Item id="2">
		<name>谷歌</name>
		<url>www.google.com</url>
	</Item>

	<Item id="2">
		<name>Unity</name>
		<url>www.unity3d.com</url>
	</Item>
</Web>

注意事项:

  • XML 标签对大小写很敏感
  • XML 标签必须正确的嵌套
  • XML 标签中的属性值必须加双/单引号
  • XML 文档必须有根元素

Unity 操作 XML

读取 XML 中的数据并展示

步骤:

  • 实例化一个 XML 文档操作对象;
  • 使用 XML 对象加载 XML;
  • 获取根节点;
  • 获取根节点下所有子节点;
  • 遍历输出。

代码演示:

using UnityEngine;
using System.Collections;
using System.Xml; //引入XML操作相关的命名空间.

/// <summary>
/// XML操作演示.
/// </summary>
public class XMLDemo : MonoBehaviour {

    //定义一个字段,存储xml的路径.
    private string xmlPath = "Assets/Datas/web.xml";

	void Start () {
        ReadXMLByPath(xmlPath);
	}

    /// <summary>
    /// 通过路径读取XML中的数据进行显示.
    /// </summary>
    /// <param name="path">xml的路径地址</param>
    private void ReadXMLByPath(string path)
    {
        //<1>实例化一个XML文档操作对象
        XmlDocument doc = new XmlDocument();

        //<2>使用XML对象加载XML
        doc.Load(path);

        //<3>获取根节点
        XmlNode root = doc.SelectSingleNode("Web");

        //<4>获取根节点下所有子节点
        XmlNodeList nodeList = root.ChildNodes;

        //<5>遍历输出
        foreach(XmlNode node in nodeList)
        {
            //取属性
            int id = int.Parse(node.Attributes["id"].Value);
            //取文本
            string name = node.ChildNodes[0].InnerText;
            string url = node.ChildNodes[1].InnerText;
			//输出
            Debug.Log(id + "--" + name + "--" + url);
        }
    }
}

读取 XML 配置并使用实体类存储

  • 创建商品 Item 实体类,并将 XML 中的数据存储到 Item 中,最终封装为一个List 数据集合
  • 这个 List 的结构合 XML 文档的结构是完全一样的
  • 和上一节唯一的区别就是一个存储在硬盘中,而一个存储在内存中

例子:将下面的XML配置加载到List实体集合中

<Shop>
	<Item>
		<speed>+2</speed>
		<rotate>+3</rotate>
		<model>model/aaa</model>
		<price>2000</price>
	</Item>
	<Item>
		<speed>+4</speed>
		<rotate>+6</rotate>
		<model>model/bbb</model>
		<price>3000</price>
	</Item>
	<Item>
		<speed>+8</speed>
		<rotate>+10</rotate>
		<model>model/ccc</model>
		<price>5000</price>
	</Item>
	<Item>
		<speed>+15</speed>
		<rotate>+20</rotate>
		<model>model/ddd</model>
		<price>8000</price>
	</Item>
</Shop>
/// <summary>
/// 商城物品Item实体类.
/// </summary>
public class ShopItem {
    private string speed;
    private string rotate;
    private string model;
    private string price;

    public ShopItem(string speed, string rotate, string model, string price)
    {
        this.speed = speed;
        this.rotate = rotate;
        this.model = model;
        this.price = price;
    }

    public string Speed
    {
        get { return speed; }
        set { speed = value; }
    }

    public string Rotate
    {
        get { return rotate; }
        set { rotate = value; }
    }

    public string Model
    {
        get { return model; }
        set { model = value; }
    }

    public string Price
    {
        get { return price; }
        set { price = value; }
    }

    public override string ToString()
    {
        return string.Format("speed:{0}, rotate:{1}, model:{2}, price:{3}", speed, rotate, model, price);
    }
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Xml;

/// <summary>
/// 商城功能模块数据操作.
/// </summary>
public class ShopData : MonoBehaviour {

    private string xmlPath = "Assets/Datas/ShopData.xml";

    //用于存储XML数据的实体集合.
    private List<ShopItem> shopList = new List<ShopItem>();

	void Start () {
        ReadXmlByPath(xmlPath);
        DebugListInfo();
	}

    /// <summary>
    /// 通过指定的路径读取XML文档.
    /// </summary>
    /// <param name="path">xml的路径</param>
    private void ReadXmlByPath(string path)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(path);
        XmlNode root = doc.SelectSingleNode("Shop");
        XmlNodeList nodeList = root.ChildNodes;
        foreach(XmlNode node in nodeList)
        {
            string speed = node.ChildNodes[0].InnerText;
            string rotate = node.ChildNodes[1].InnerText;
            string model = node.ChildNodes[2].InnerText;
            string price = node.ChildNodes[3].InnerText;
      
            //遍历完毕后,存储到List实体集合中.
            ShopItem item = new ShopItem(speed, rotate, model, price);
            shopList.Add(item);
        }
    }

    /// <summary>
    /// 测试函数,测试List中的数据.
    /// </summary>
    private void DebugListInfo()
    {
        for(int i = 0; i < shopList.Count; i++)
        {
            Debug.Log(shopList[i].ToString());
        }
    }
}

参考/拓展阅读

https://www.w3school.com.cn/xml/xml_intro.asp

https://blog.csdn.net/RCHT1_Hideonbush/article/details/124000339

http://t.csdn.cn/ZZ2Ec