我们在开发过程中避免不了对数据的存储,像字符串的处理方式XML就是一个很好的栗子。接下我们来研究一下关于XML文件的生成与解析。
当然,大家完全可以参照 官方API 来学习;
生成
Xml 文件创建最主要的步骤就是对节点的排序,节点间的关联就是靠着这个排序完成的。主要用到的函数包括下 CreateElement、SetAttribute 与 AppendChild。具体的用法,可以参考下面的示例代码:
/// <summary>
/// 根据路径来创建xml文件
/// </summary>
/// <param name="filePath">文件路径</param>
public void XmlCreate(string filePath)
{
if (!File.Exists(filePath))
{
// 创建xml文档实例
XmlDocument xmlDoc = new XmlDocument();
// 创建根节点
XmlElement root = xmlDoc.CreateElement("成绩单");
// 创建第一个子节点
XmlElement student = xmlDoc.CreateElement("学生");
// 设置节点属性
student.SetAttribute("学号", "003");
student.SetAttribute("姓名", "王大头");
// 创建第一子节点的子节点
XmlElement subject1 = xmlDoc.CreateElement("语文");
subject1.InnerText = "59";
XmlElement subject2 = xmlDoc.CreateElement("数学");
subject2.InnerText = "58";
XmlElement subject3 = xmlDoc.CreateElement("英语");
subject3.InnerText = "61";
// 排序
student.AppendChild(subject1);
student.AppendChild(subject2);
student.AppendChild(subject3);
root.AppendChild(student);
xmlDoc.AppendChild(root);
xmlDoc.Save(filePath);
print("完成 XML 创建");
UnityEditor.AssetDatabase.Refresh(); // 编辑器模式下刷新显示
}
}
然后,运行代码我们就能生成这样的一个XML文件:
读取
对XML文件的读取其实才是我们比较需要的,主要函数包括:
Load 、SelectSingleNode 与 GetAttribute 等。同样,具体用法可以参考下面的代码:
/// <summary>
/// 读取xml
/// </summary>
/// <param name="path">路径</param>
public void XmlRead(string path)
{
if (File.Exists(path))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(path);
XmlNodeList students = xmlDoc.SelectSingleNode("成绩单").ChildNodes;
foreach (XmlElement student in students)
{
Debug.Log("学号: " + student.GetAttribute("学号") + " 姓名: " + student.GetAttribute("姓名"));
foreach (XmlElement subject in student)
{
Debug.Log(subject.Name + " : " + subject.InnerText);
}
Debug.Log("\n");
}
UnityEditor.AssetDatabase.Refresh();
}
}
更新 添加 删除
其他的这几个操作,由于通常我们都是策划手动修改XML文件,代码中的操作不是很常用,这边也只是贴出代码:
#region 更新 添加 删除(操作不常用 且过于简单)
/// <summary>
/// 更新指定id的xml数据
/// </summary>
/// <param name="path"></param>
/// <param name="id"></param>
public void XmlUpdate(string path)
{
if (File.Exists(path))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(path);
XmlNodeList students = xmlDoc.SelectSingleNode("成绩单").ChildNodes;
foreach (XmlElement student in students)
{
if (student.GetAttribute("学号") == "003")
{
student.SetAttribute("学号", "004");
foreach (XmlElement subject in student.ChildNodes)
{
if (subject.Name == "数学")
subject.InnerText = "65";
}
break;
}
}
xmlDoc.Save(path);
print("XML 已更新");
}
}
/// <summary>
/// 添加一条数据
/// </summary>
/// <param name="path"></param>
public void XmlAdd(string path)
{
if (File.Exists(path))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(path);
XmlNode root = xmlDoc.SelectSingleNode("成绩单");
XmlElement student = xmlDoc.CreateElement("学生");
student.SetAttribute("学号", "011");
student.SetAttribute("姓名", "李大傻");
XmlElement subject1 = xmlDoc.CreateElement("语文");
subject1.InnerText = "92";
XmlElement subject2 = xmlDoc.CreateElement("数学");
subject2.InnerText = "98";
XmlElement subject3 = xmlDoc.CreateElement("英语");
subject3.InnerText = "95";
student.AppendChild(subject1);
student.AppendChild(subject2);
student.AppendChild(subject3);
root.AppendChild(student);
xmlDoc.AppendChild(root);
xmlDoc.Save(path);
print("XML 已添加");
}
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="path"></param>
/// <param name="id"></param>
public void XmlDelete(string path)
{
if (File.Exists(path))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(path);
XmlNodeList students = xmlDoc.SelectSingleNode("成绩单").ChildNodes;
foreach (XmlElement student in students)
{
if (student.GetAttribute("学号") == "011")
{
// 移除指定学号的属性
student.RemoveAttribute("学号");
}
foreach (XmlElement subject in student.ChildNodes)
{
// 移除 李大傻 的 英语成绩
if (subject.Name == "英语" && student.GetAttribute("姓名") == "李大傻")
{
subject.RemoveAll();
}
}
}
xmlDoc.Save(path);
print("XML 已删除");
}
}
#endregion
经过了上述操作之后,得到的XML文件应该是这样的:
而程序中的打印结果为: