XML相关
Xml是可拓展标记语言,一种文件格式。我们使用xml来完成对数据持久化的存储。等待我们有一程序运行结束之后,将内存中的数据进行保存,(保存在硬盘/服务器)实现对数据的持久化存储。
xml文件的读取和保存以及修改
要点:
-
XMl文件的加载
-
XML文件节点的查找访问
-
XML文件节点内容的读取 (InnerText还是Attributes["id"].Value 形式访问)
代码中有详细注释!可供参考对比学习!
using System.IO;
using System.Xml;
using UnityEngine;
namespace Building.XML
{
public class LoadXMLFile:MonoBehaviour
{
private void Start()
{
//得到xml文件
XmlDocument xmlFile = new XmlDocument();
//通过加载text格式进行解析成xml形式进行获取
//TextAsset textAsset = Resources.Load<TextAsset>("Text");
// xmlFile.LoadXml(textAsset.text);
//通过路径进行加载
xmlFile.Load(Application.streamingAssetsPath+"/Text.xml");
//读取xml中节点
XmlNode root = xmlFile.SelectSingleNode("PlayerInfo");
XmlNode nodeName = root.SelectSingleNode("Name");
XmlNode nodeList = root.SelectSingleNode("Item");
//获取自定义版本的数据结构类型
print(nodeList.Attributes["id"].Value);
print(nodeList.Attributes["size"].Value);
//或者
print(nodeList.Attributes.GetNamedItem("id").Value);
print(nodeList.Attributes.GetNamedItem("size").Value);
//直接获取数组中的元素
XmlNode tempNodeList1 = root.SelectSingleNode("ItemList1");
XmlNodeList xmlNodeList1 = tempNodeList1.SelectNodes("Item");
//找出List中所有的节点 打印节点组中的 id size节点的InnerText
//var 类型推断不出来 XmlNode类型
foreach (XmlNode item in xmlNodeList1)
{
print(item.Name);
print(item.SelectSingleNode("id").InnerText);
/* <Item>
<id>2003</id>> 通过InnerText来访问<> <>中间的内容
<size>17.5</size>>
</Item>>*/
print(item.SelectSingleNode("size").InnerText);
}
for (int i = 0; i < xmlNodeList1.Count; i++)
{
print(xmlNodeList1[i].Name);
print(xmlNodeList1[i].SelectSingleNode("id").InnerText);
print(xmlNodeList1[i].SelectSingleNode("size").InnerText);
}
//直接获取数组中的元素 形式 innerText访问还是获取 Attributes["size"].Value 访问数值
//-------注意区分元素中是否还有子节点 根据是否有子节点来选择获取节点内容
XmlNode tempNodeList = root.SelectSingleNode("ItemList");
XmlNodeList xmlNodeList = tempNodeList.SelectNodes("Item");
//找出List中所有的节点 打印节点组中的 id size节点的InnerText
//var 类型推断不出来 XmlNode类型
foreach (XmlNode item in xmlNodeList)
{
print(item.Name);
print(item.Attributes["id"].InnerText);
print(item.Attributes["size"].Value);
}
for (int i = 0; i < xmlNodeList.Count; i++)
{
print(xmlNodeList[i].Name);
print(xmlNodeList[i].Attributes["id"].Value); //<Item id="2011" size="15.5"/>
//单行内嵌的 通过Attributs["name"].Value访问
print(xmlNodeList[i].Attributes["size"].Value);
}
//============================读================
//==================xml存储的路径
// 1.Resources 可读 不可写 打包后找不到 ×
// 2.Application.streamingAssetsPath 可读 PC端可写 找得到 ×
// 3.Application.dataPath 打包后找不到 ×
// 4.Application.persistentDataPath 可读可写找得到 √
string path = Application.streamingAssetsPath + "/xmlSaveFile.xml";
print(Application.persistentDataPath);
//创建固定版本信息
XmlDocument saveXmlFile = new XmlDocument();
//文件格式声明
XmlDeclaration xmlDeclaration = saveXmlFile.CreateXmlDeclaration("1.0", "utf-8", "");
saveXmlFile.AppendChild(xmlDeclaration);
//添加根节点
//这里以存储班级信息为例子
XmlElement classInfo =saveXmlFile.CreateElement("ClassInfo");
saveXmlFile.AppendChild(classInfo);
//创建子节点
XmlElement teacher = saveXmlFile.CreateElement("teacher");
classInfo.AppendChild(teacher);
XmlElement teacherName = saveXmlFile.CreateElement("teacherName");
teacherName.InnerText = "TonyChang";
teacher.AppendChild(teacherName);
XmlElement teacherId = saveXmlFile.CreateElement("teacherId");
teacherId.InnerText = "3306";//设置teacherID名称
teacher.AppendChild(teacherId);
//学生信息模块
XmlElement stusElement = saveXmlFile.CreateElement("Students");
XmlElement stuEle;//学生信息
for (int i = 0; i < 15; i++)
{
stuEle = saveXmlFile.CreateElement("Student");
stuEle.SetAttribute("stuNo", (i + 1).ToString());
stuEle.SetAttribute("age", 19.ToString());
stusElement.AppendChild(stuEle);
}
//学生信息模块添加到xml文件中
classInfo.AppendChild(stusElement);
//保存Xml文件
saveXmlFile.Save(path);
//----------------------XML的内容修改------------------------
if (File.Exists(path))
{
XmlDocument Xml1 = new XmlDocument();
//加载到新建的的xml文件中
Xml1.Load(path);
//获取要修改的文件节点
XmlNode changeNode;
changeNode = Xml1.SelectSingleNode("ClassInfo/teacher/teacherId");
//将3306-->8888
changeNode.InnerText = "8888";
//---删除(通过父节点删除)
XmlNode FatherNode = Xml1.SelectSingleNode("ClassInfo/teacher");
FatherNode.RemoveChild(changeNode);
//---添加新的节点
XmlNode changedNode=Xml1.CreateElement("teacherId");
changedNode.InnerText = "8888";
FatherNode.AppendChild(changedNode);
//修改了记得保存
Xml1.Save(path);
}
}
}
}
textXML文件
<?xml version="1.0" encoding="utf-8"?>
<!--注释内容-->
<PlayerInfo >
<name>TonyChang</name>
<age>18</age>
<height>175.5</height>>
<Item id="1997" size="12.5"/>
<Item1>
<id>1998</id>>
<size>12.25</size>
</Item1>>
<ItemList1>
<!--属性
和元素节点的区别?
表现形式不同的同种意义
-->
<Item>
<id>2002</id>>
<size>16.5</size>>
</Item>>
<Item>
<id>2003</id>>
<size>17.5</size>>
</Item>>
<Item>
<id>2004</id>>
<size>18.5</size>>
</Item>>
</ItemList1>
<ItemList>
<!--属性
和元素节点的区别?
表现形式不同的同种意义
-->
<Item id="2011" size="15.5"/>
<Item id="2012" size="16.5"/>
<Item id="2013" size="17.5"/>
</ItemList>
</PlayerInfo>
文件格式如图所示;
生成新建的“xmlSaveFile.xml”文件内容
标签:XML,xml,--,SelectSingleNode,Unity,InnerText,print,XmlNode,节点 From: https://www.cnblogs.com/TonyCode/p/17845010.html