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