1.XML结构:XML是一种树结构的文本
2.XML注释:格式:<!--在其中书写注释-->,在注释中可以单行注释也可以多行注释
3.固定内容:<?xml version="1.0" encoding="UTF-8"?>版本和编码信息
4.基本语法:<root>...</root>,一个节点的内容使用尖括号包裹节点名称开始,尖括号包裹斜杠和节点名称结束,子节点的内容被包裹在这两个尖括号中间。通过在最下层的子节点的首尾尖括号之间包裹数据的形式保存数据。这种节点的树形结构和对象这种引用类型中包含值类型(没有子节点)和其他引用类型(有子节点)的形式是一致的。
5.属性:和元素节点只是写法上的区别,相当于简化的节点写法
1)<Father age="52">...</Father>
2)<Father age="52"/>
二.Unity中XML的存放位置
1.Resources 只读文件,打包后找不到
2.Application.streamingAssetsPath 可读,PC端可写,能找到
3.Application.dataPath 打包后找不到
4.Application.persistentDataPath 可读可写能找到
三.Unity中读取xml文件信息
1.常见的读取方式
1)XmlDocument:把数据加载到内存中,方便读取
2)XmlTextReader:以流形式加载数据,内存占用更少,但是单向只读
3)Linq
2.使用XmlDocument读取和存储信息的一些方法
1)LoadXml成员方法:将字符串加载到xml中
2)Load成员方法:将路径对应的xml文件的内容加载到xml中
3)SelectSingleNode成员方法:得到单个节点,存储为XmlNode对象,XmlNode中同样有这个成员方法得到节点的单个子节点
4)节点对象.Attributes[属性名].Value得到属性值,或者节点对象.Attributes.GetNamedItem(属性名).Value可以达到同样的效果
5)SelectNodes成员方法:得到节点下的所有同名节点,存储为XmlNodeList对象
6)CreateXmlDeclaration成员方法:创建固定版本和编码信息
7)AppendChild:把节点对象添加到xml中
8)CreateElement:创建节点
9)InnerText属性:节点中存储的信息
10)SetAttribute成员方法:添加属性
11)Save成员方法:保存
3.使用XmlDocument读取和存储信息的一些重要类
1)XmlNode:读取出的单个节点信息类
2)XmlNodeList:读取出的多个同名节点信息类存储到一个list中
3)XmlElement:存储时的单个节点信息类
4)XmlDeclaration:存储时创建出的xml文件固定版本和编码等信息类
四.xml序列化和通用保存加载类
1.xml序列化
1)序列化:把对象转化为可传输的字节序列过程称为序列化
反序列化:将字节序列还原为对象的过程称为反序列化
2)using关键字:using关键字的格式和if类似,都是在后面跟上一个小括号和一个大括号。using关键字后面的小括号中的内容一般是声明一个对象,这个对象需要是继承IDispose接口的对象,在大括号中的代码块调用完毕后,系统会自动调用小括号中对象的Dispose方法将对象释放。一般用于内存占用较大或者读写时操作。
3)序列化类XmlSerializer和输出流StreamWriter:序列化类的对象相当于一个翻译机器,负责将对象进行序列化翻译,而输出流的对象相当于传送带,负责传输序列化前后的信息。因此,new一个XmlSerializer类对象时需要指定类型(翻译的类的类型),而new一个StreamWriter类对象时需要指定文件地址(传动带的终点),“输入”或者“输出”相当于是说的传送方向(传送带是单向的);使用Serialize方法进行序列化翻译时需要指定流对象(传送带)和要序列化的对象。
4)示例:
TestClass test = new TestClass(); string path = Application.persistentDataPath + "/TestClass.xml"; //尝试创建一个文件流,需要指定文件地址,会自动打开文件(如果有文件直接打开,如果没有文件自动新建一个文件再打开) //using括号中声明的对象会在大括号中语句块结束后自动释放 //using在语句块结束后自动调用对象的Dispose方法(继承IDispose接口),让对象自行销毁 //一般在内存占用较大或者有读写操作时使用 using(StreamWriter stream = new StreamWriter(path)) { //序列化对象相当于翻译机器,将对象翻译为序列化文件,需要指定机器能翻译的对象的类型;流相当于传送带,负责运输翻译的对象和结果 //创建序列化对象,需要指定这个序列化对象的类型 XmlSerializer xs = new XmlSerializer(typeof(TestClass)); //调用序列化对象的Serialize方法将对象test通过stream流序列化 xs.Serialize(stream,test); }