什么是 XML
XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。
基本语法
<?xml version="1.0" encoding="UTF-8"?>`在这里插入代码片`
<bookstore>
<book category="fiction">
<title lang="en">Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
XML 数据存储方式
- 元素存储一个值
<time>20:45</time>
- 属性存储多个值
<time hours="20" minutes="45"/>
读取和修改 XML 文件
路径选择注意事项
在 Unity 中存储 XML 文件必须使用各平台都可读可写可找到的路径:
Resources
:可读,不可写,打包后找不到Application.streamingAssetsPath
:可读,PC 端可写,找得到Application.dataPath
:打包后找不到Application.persistentDataPath
:可读可写找得到(推荐)
读取操作方法
- XmlDocument - 数据加载到内存中,方便读取
- XmlTextRender - 以流的形式加载,内存占用少,但单向可读
- Linq(之后介绍)
XmlDocument 读取示例
// 第一步:获取文件
XmlDocument xml = new XmlDocument();
TextAsset asset = Resources.Load<TextAsset>("TestXml");
xml.LoadXml(asset.text);
// 第二步:读取元素和属性信息
// 获取根节点
XmlNode root = xml.SelectSingleNode("Root");
// 获取子节点
XmlNode nodeName = root.SelectSingleNode("name");
print(nodeName.InnerText);
// 获取属性(两种方式)
XmlNode nodeItem = root.SelectSingleNode("Item");
// 方式一
print(nodeItem.Attributes["id"].Value);
print(nodeItem.Attributes["number"].Value);
// 方式二
print(nodeItem.Attributes.GetNamedItem("id").Value);
print(nodeItem.Attributes.GetNamedItem("number").Value);
// 获取所有同名节点
XmlNodeList friendList = xml.SelectNodes("Friend");
// 遍历方式一:迭代器
foreach(XmlNode item in friendList)
{
print(item.SelectSingleNode("name").InnerText);
print(item.SelectSingleNode("age").InnerText);
}
// 遍历方式二:for循环
for(int i = 0; i < friendList.Count; i++)
{
print(friendList[i].SelectSingleNode("name").InnerText);
print(friendList[i].SelectSingleNode("age").InnerText);
}
存储操作
// 第一步:决定存储位置
string path = Application.persistentDataPath + "/PlayerInfo2.xml";
// 第二步:存储XML文件
XmlDocument xml = new XmlDocument();
// 添加版本信息
XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
xml.AppendChild(xmlDec);
// 添加根节点
XmlElement root = xml.CreateElement("Root");
xml.AppendChild(root);
// 添加子节点(单个)
XmlElement name = xml.CreateElement("name");
name.InnerText = "Unity小张";
root.AppendChild(name);
// 添加多个子节点
XmlElement listInt = xml.CreateElement("listInt");
for(int i = 0; i < 3; i++)
{
XmlElement childNode = xml.CreateElement("int");
childNode.InnerText = i.ToString();
listInt.AppendChild(childNode);
}
root.AppendChild(listInt);
// 添加属性
XmlElement item = xml.CreateElement("Item");
item.SetAttribute("id", "1");
item.SetAttribute("num", "10");
root.AppendChild(item);
// 保存文件
xml.Save(path);
修改操作
// 第一步:判断文件是否存在
if(File.Exists(path))
{
XmlDocument newXml = new XmlDocument();
newXml.Load(path);
// 第二步:修改数据
// 获取子节点(两种写法)
XmlNode node = newXml.SelectSingleNode("Root").SelectSingleNode("atk");
// 简洁写法
node = newXml.SelectSingleNode("Root/atk");
// 获取父节点
XmlNode root2 = newXml.SelectSingleNode("Root");
// 移除子节点
root2.RemoveChild(node);
// 添加新节点
XmlElement speed = newXml.CreateElement("speed");
speed.InnerText = "100";
root2.AppendChild(speed);
// 第三步:保存修改
newXml.Save(path);
}