这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
概述
上一篇介绍到Unity读取Json文件,在Unity开发过程中XML文件和Json文件同样非常重要, 其实核心就是处理字符串。一个是XML的字符串一个是Json的字符串,尤其是在处理网络请求的时候,肯定是要用的。本篇文章就讲解下XML文件在Unity中的使用方法,希望对大家有所帮助。
什么是XML
XML指可扩展标记语言(EXtensible Markup Language)。是一个被用来传输数据和存储数据的文本文件,很像HTML的标记语言。XML的设计宗旨是传输数据,而不是显示数据。XML的标签没有被预定义,需要自行定义标签。XML被设计为具有自我描述性。 是 W3C 的推荐标准。
在Unity中使用XML
在Unity中,经常有遇到要处理大量字符串的情况,这时候XML就起到了非常重要的作用。而且XML文件结构层级清晰,非常实用。想要在Unity中,首先需要引用命名空间using System.Xml;才可以对XML文件进行操作,其次是using System.IO;,这个是对文件进行操作的命名空间(读取文件等)。接下来就来对XML文件进行增删改查操作。
创建XML
首先来看一下创建代码:
public void createXml()
{
//xml保存的路径,这里放在Assets路径 注意路径。
string filepath = Application.dataPath + @"/student.xml";
//继续判断当前路径下是否有该文件
if (!File.Exists(filepath))
{
//创建XML文档实例
XmlDocument xmlDoc = new XmlDocument();
//创建root节点,也就是最上一层节点
XmlElement root = xmlDoc.CreateElement("Students");
//继续创建下一层节点
XmlElement elmNew = xmlDoc.CreateElement("StudentInfo");
//给节点添加两个属性 ID 和 NAME
elmNew.SetAttribute("id", "0");
elmNew.SetAttribute("name", "张三");
//继续创建下一层节点
XmlElement _class = xmlDoc.CreateElement("Class");
//设置节点中的数值
_class.InnerText = "三年一班";
XmlElement number = xmlDoc.CreateElement("Number");
number.InnerText = "20210101";
XmlElement mobile = xmlDoc.CreateElement("Mobile");
mobile.InnerText = "13188888888";
//把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序
elmNew.AppendChild(_class);
elmNew.AppendChild(number);
elmNew.AppendChild(mobile);
root.AppendChild(elmNew);
xmlDoc.AppendChild(root);
//把XML文件保存至本地
xmlDoc.Save(filepath);
Debug.Log("createXml OK!");
}
}
在运行上述代码,会创建一个名为student.xml的文件,xml的内容为:
现在来让我们一起看一下上述代码中用到的方法: XmlDocument:
- CreateElement:创建节点
- AppendChild:添加节点,使被添加的节点成为子节点,要注意书写时的顺序
- Save:保存xml文件 XmlElement:
- SetAttribute:设置节点属性
- InnerText:设置节点内容
- AppendChild:添加节点,使被添加的节点成为子节点) 只需要一层层的设置就可以创建一个有层级结构的XML文件。
向XML文件中添加数据
其原理和上述的创建XML问价基本差不多,只不过比创建多增加了一步加载XML文件和获取XML文件节点方法,具体代码如下:
public void AddXml()
{
string filepath = Application.dataPath + @"/student.xml";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
//读取XML文件
xmlDoc.Load(filepath);
//获取到根节点
XmlNode root = xmlDoc.SelectSingleNode("Students");
XmlElement elmNew = xmlDoc.CreateElement("StudentInfo");
elmNew.SetAttribute("id", "1");
elmNew.SetAttribute("name", "李四");
XmlElement _class = xmlDoc.CreateElement("Class");
_class.InnerText = "三年一班";
XmlElement number = xmlDoc.CreateElement("Number");
number.InnerText = "20210102";
XmlElement mobile = xmlDoc.CreateElement("Mobile");
mobile.InnerText = "15866666666";
elmNew.AppendChild(_class);
elmNew.AppendChild(number);
elmNew.AppendChild(mobile);
root.AppendChild(elmNew);
xmlDoc.AppendChild(root);
xmlDoc.Save(filepath);
Debug.Log("AddXml OK!");
}
}
最终我们就实现了向XML中添加文件的操作,运行后的结果为
上述代码中:
XmlDocument中的Load放方法为加载XML文件
我们还会发现,在创建的时候使用的是XmlElement,而在添加的时候使用的是XmlNode,那么他们有什么区别呢?
- XmlElement继承XmlNode。
- Xml节点有多种类型:属性节点、注释节点、文本节点、元素节点等。XmlNode是这多种节点的统称,而XmlElement指的就是元素节点。
修改XML文件内容
想要修改XML文件大概的思路是,首先拿到要修改的节点,然后在使用InnerText对要修改的参数进行更改操作。
接下来我们来更改下上面创建好的XML中的李四的姓名改为李四五手机号为22222222222。一起来看一下操作。
首先要获取到根节点Students下的所有子节点,然后遍历所有子节点,找到属性name为李四的节点,接着遍历属性name为李四的节点,找到Mobile节点,然后设置其手机号为22222222222,最后保存文件。
具体实现脚本为:
public void UpdateXml()
{
string filepath = Application.dataPath + @"/student.xml";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
//根据路径将XML读取出来
xmlDoc.Load(filepath);
//得到transforms下的所有子节点
XmlNodeList nodeList = xmlDoc.SelectSingleNode("Students").ChildNodes;
//遍历所有子节点
foreach (XmlElement xe in nodeList)
{
//拿到节点中属性name = 李四的节点
if (xe.GetAttribute("name") == "李四")
{
//更新节点属性
xe.SetAttribute("name", "李四五");
//继续遍历
foreach (XmlElement x1 in xe.ChildNodes)
{
if (x1.Name == "Mobile")
{
//这里是修改节点名称对应的数值,而上面的拿到节点连带的属性。。。
x1.InnerText = "222222222222";
}
}
break;
}
}
xmlDoc.Save(filepath);
Debug.Log("UpdateXml OK!");
}
}
运行之后的效果为:
上述代码中有用到一个前两个操作没有用到的内容:
- ChildNodes:拿到所有子节点,但不包含子节点里的子节点
- GetAttribute:拿到节点属性
删除XML中的内容
删除操作和修改操作方法几乎相同,唯一不同的是,修改使用的是SetAttribute或者是InnerText,而删除则是需要用RemoveAttribute或者是RemoveAll。具体操作为找到要删除的属性或节点,使用RemoveAttribute或者是RemoveAll对数据进行操作。接下来我们删除李四五的ID属性和李四五的Mobile。
具体代码如下:
public void deleteXml()
{
string filepath = Application.dataPath + @"/student.xml";
if (File.Exists(filepath))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filepath);
XmlNodeList nodeList = xmlDoc.SelectSingleNode("Students").ChildNodes;
foreach (XmlElement xe in nodeList)
{
if (xe.GetAttribute("name") == "李四五")
{
//删除节点属性
xe.RemoveAttribute("id");
}
foreach (XmlElement x1 in xe.ChildNodes)
{
if (x1.Name == "Mobile")
{
//删除节点内容
x1.RemoveAll();
}
}
}
xmlDoc.Save(filepath);
Debug.Log("deleteXml OK!");
}
}
操作结果如下
总结
对于在Unity中操作XML这种方法是最原始的方法,还有更高级的则可以通过封装方法或者是序列化和反序列化等对XML文件进行操作,这个等以后在进行介绍。在本文中,总的来说,代码没什么难度,创建和添加XML文件代码一直都是那么几句话,最后注意一下顺序和层级就OK了,而修改和删除XML文件,就是首先遍历所有节点,然后找到要修改的节点进行修改或删除,也就是那么几个主要的参数。
写在最后
所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。Demo源码会在之后整理好之后分享给大家。欢迎大家相互学习进步。