Unity(C#)读写xml文件详解
Posted 椎名mikan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity(C#)读写xml文件详解相关的知识,希望对你有一定的参考价值。
目录
什么是xml文件?
xml文件是一种可拓展标记语言,由于简单易用,常被应用程序用于保存数据,unity也是如此,在我们需要控制读写用户的存档时,除了unity自带的PlayerPrefs或者是json,最常用到的就是xml文件,本篇 文章详细介绍unity(c#)中如何操控xml文件
xml文件的结构
先来看看一个完整的xml文件长什么样
<?xml version="1.0" encoding="UTF-8"?>
<student>
<student1 name="椎名">
<age>5</age>
<sex>man</sex>
</student1>
<student2 name="mikan">
<age>10</age>
<sex>woman</sex>
</student2>
<student3 name="みかん">
<age>15</age>
<sex>woman</sex>
</student3>
</student>
一、文档声明:从文档可见,第一行的"<?xml version="1.0" encoding="UTF-8"?>"为xml文件的声明,意思是文档符合xml1.0规范,默认编码为UTF-8
二、根节点:这里的<student>为根节点,名称可以随意定义,它是文档里唯一的节点,开始于文档开头,结束于文档最末尾
三、元素:示例中<age>10</age>即为xml中的元素,<age>和</age>分别为开始标签和结束标签,10为元素的内容(注:xml的标签区分大小写,如写成<age>和</Age>则无法识别)
四:属性:文档示例"<student1 name=“椎名”></student1>"中,name即为元素student1的属性,一个元素可以拥有多个属性
如何读写xml文件
大致介绍完xml文件,现在来看看如何在unity中读写xml文件(后面使用的示例还是上面的文档)
- C#要读写xml文件,首先要引用System.Xml
using System.Xml;
- 用unity的Resources.Load加载文件
TextAsset xmlFile = Resources.Load<TextAsset>(path); //加载path路径下的xml文件内容
XmlDocument document = new XmlDocument(); //创建xml文件的变量
document.LoadXml(xmlFile.text); //让xml文件变量读取xmlFile内的文本
- 解析xml,先获取根节点下的所有子节点
XmlNodeList nodeList = document.SelectSingleNode("student").ChildNodes; //将student节点的子节点加入至nodeList
- 将nodelist下的某个子节点转化成xml元素,就可以进行读写了
XmlElement elementStudent = (XmlElement)nodeList[num]; //子节点转化为元素
elementStudent.GetAttribute("name"); //获取元素的name属性,如果上一行num为0,则这里返回的是"椎名"
elementStudent.InnerText //获取元素的内容
- 完整代码
using UnityEngine;
using System.Xml;
public class XmlTest : MonoBehaviour
private void Start()
TextAsset xmlFile = Resources.Load<TextAsset>("xml");
XmlDocument document = new XmlDocument();
document.LoadXml(xmlFile.text);
XmlNodeList nodeList = document.SelectSingleNode("student").ChildNodes;
XmlElement elementStudent = (XmlElement)nodeList[0];
Debug.Log(elementStudent.GetAttribute("name"));
foreach (XmlElement element in elementStudent.ChildNodes)
Debug.Log(element.InnerText);
- 将文章开头的完整xml文档放在unity中Resources文件夹里,然后将上面的代码随便挂在一个物体上,运行游戏
可以发现成功将student1的属性"name"和student1中的age和sex这两个元素的内容打印出来了
ok,关于如何unity读写xml文件就介绍到这里,感谢大家的阅读。
如果对unity开发感兴趣,可以加入我们的交流群共同探讨!!
群号:385075578
个人QQ:792006305
C#中XmlTextWriter读写xml文件详细介绍
XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。为了使用这个类,你必须首先创建一个新的XmlTextWriter对象,然后你可以将XML片断加入到这个对象中。这个类中包含了不少的方法用于将各种类型的XML元素添加到XML文件中,下表给出了这些方法的名字和描述情况:
方法
描述
WriteStartDocument
书写版本为“1.0”的 XML 声明
WriteEndDocument
关闭任何打开的元素或属性
Close
关闭流
WriteDocType
写出具有指定名称和可选属性的 DOCTYPE 声明
WriteStartElement
写出指定的开始标记
WriteEndElement
关闭一个元素
WriteFullEndElement
关闭一个元素,并且总是写入完整的结束标记
WriteElementString
写出包含字符串值的元素
WriteStartAttribute
书写属性的起始内容
WriteEndAttribute
关闭上一个 WriteStartAttribute 调用
WriteRaw
手动书写原始标记
WriteString
书写一个字符串
WriteAttributeString
出具有指定值的属性
WriteCData
写出包含指定文本的 <![CDATA[...]]> 块
WriteComment
写出包含指定文本的注释 <!--...-->
WriteWhiteSpace
写出给定的空白
WriteProcessingInstruction
写出在名称和文本之间带有空格的处理指令,如下所示:<?name text?>
如果你对于XML十分熟悉,那么你一定能很好的理解上面的这些方法。下面我们将给出一个例子,在这个例子中,我们将先创建一个文档,添加一些元素,然后关闭这个文档。添加了元素后你还可以添加子元素,属性和其他内容。下面的代码就是这样的一个例子,它创建了一个文件名为title的XML文件。
using System;
using System.IO;
using System.Xml;
public class Sample
public static void Main()
XmlTextWriter writer = new XmlTextWriter("titles.xml", null);
//写入根元素
writer.WriteStartElement("items");
//加入子元素
writer.WriteElementString("title", "Unreal Tournament 2003");
writer.WriteElementString("title", "C&C: Renegade");
writer.WriteElementString("title", "Dr. Seuss‘s ABC");
//关闭根元素,并书写结束标签
writer.WriteEndElement();
//将XML写入文件并且关闭XmlTextWriter
writer.Close();
如果你编译并且执行上面的代码,你将创建这个XML文件,文件中包含如下内容:
<items>
<title>Unreal Tournament 2003</title>
<title>C&C: Renegade</title>
<title>Dr. Seuss‘s ABC</title>
</items>
上面的代码创建了一个名为writer的XmlTextWriter对象。当这个对象被创建时,它被关联到一个名为titles.xml的文件。接着,程序创建了一个叫做items的根属性,WriteStartElement方法创建了这个属性的开始标签。接下来,程序调用了WriteElementString方法创建了三个子元素。从上面的代码你还可以看到,这个方法使用第一个参数(在上面的程序中是title)作为元素的标签;使用第二个参数作为元素的值。当你添加了所有的元素后,你需要关闭根元素。这时你可以调用WriteEndElement方法关闭那个最近被打开的元素;在本例中,这个最近被打开的元素就是根元素。当所有的数据都已经写好,根元素也已经关闭时,你可以将信息传送给你的XmlTextWriter。这意味着这时候你可以调用Close方法关闭它了。
上面的代码相对十分的简单,下面我们看一个使用了XmlTextWriter类中更多方法,功能更加完善的例子。
using System;
using System.IO;
using System.Xml;
public class Sample
public static void Main()
XmlTextWriter writer = new XmlTextWriter("myMedia.xml", null);
//使用自动缩进便于阅读
writer.Formatting = Formatting.Indented;
//书写根元素
writer.WriteStartElement("items");
//开始一个元素
writer.WriteStartElement("item");
//向先前创建的元素中添加一个属性
writer.WriteAttributeString("rating", "R");
//添加子元素
writer.WriteElementString("title", "The Matrix");
writer.WriteElementString("format", "DVD");
//关闭item元素
writer.WriteEndElement(); // 关闭元素
//在节点间添加一些空格
writer.WriteWhitespace("\n");
//使用原始字符串书写第二个元素
writer.WriteRaw("<item>" +
"<title>BloodWake</title>" +
"<format>XBox</format>" +
"</item>");
//使用格式化的字符串书写第三个元素
writer.WriteRaw("\n <item>\n" +
" <title>Unreal Tournament 2003</title>\n" +
" <format>CD</format>\n" +
" </item>\n");
// 关闭根元素
writer.WriteFullEndElement();
//将XML写入文件并关闭writer
writer.Close();
上面代码编译运行后将得到myMedia.xml文件,文件的内容为:
<items>
<item rating="R">
<title>The Matrix</title>
<format>DVD</format>
</item>
<item>
<title>BloodWake</title>
<format>XBox</format>
</item>
<item>
<title>Unreal Tournament 2003</title>
<format>CD</format>
</item>
</items>
上面代码中的注释说明了这个程序的功能是如何实现的。需要记住的一件事是:当调用方法开始一个操作时,你需要在程序的合适的地方调用方法结束这个操作。例如,你调用了StartElement,你就必须调用EndElement关闭元素;当然在这两个调用之间你也可以加入一个子元素。无论你何时调用EndElement方法,它总是关闭最近使用StartElement方法打开的那个元素(这和栈的工作方式很相似)。
使用XmlTextWriter十分的容易,不过我还是建议你自己动手试试这些代码和方法。你试过以后会发现这些代码能够很容易地集成到你的程序中。你还应该记住,XmlTextWriter仅仅是.NET提供的众多XML类中的一个。和XmlTextWriter一样,其他的XML类也十分的容易使用
2)
我用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程。
已知有一个XML文件(bookstore.xml)如下:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon‘s Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
</bookstore>
1、往<bookstore>节点中插入一个<book>节点:
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load("bookstore.xml");
XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点
xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
XmlElement xesub1=xmlDoc.CreateElement("title");
xesub1.InnerText="CS从入门到精通";//设置文本节点
xe1.AppendChild(xesub1);//添加到<book>节点中
XmlElement xesub2=xmlDoc.CreateElement("author");
xesub2.InnerText="候捷";
xe1.AppendChild(xesub2);
XmlElement xesub3=xmlDoc.CreateElement("price");
xesub3.InnerText="58.3";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<bookstore>节点中
xmlDoc.Save("bookstore.xml");
结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon‘s Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book genre="李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
</book>
</bookstore>
2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
foreach(XmlNode xn in nodeList)//遍历所有子节点
XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach(XmlNode xn1 in nls)//遍历
XmlElement xe2=(XmlElement)xn1;//转换类型
if(xe2.Name=="author")//如果找到
xe2.InnerText="亚胜";//则修改
break;//找到退出来就可以了
break;
xmlDoc.Save("bookstore.xml");//保存。
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon‘s Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book genre="update李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>亚胜</author>
<price>58.3</price>
</book>
</bookstore>
3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。
XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach(XmlNode xn in xnl)
XmlElement xe=(XmlElement)xn;
if(xe.GetAttribute("genre")=="fantasy")
xe.RemoveAttribute("genre");//删除genre属性
else if(xe.GetAttribute("genre")=="update李赞红")
xe.RemoveAll();//删除该节点的全部内容
xmlDoc.Save("bookstore.xml");
最后结果为:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book ISBN="2-3631-4">
<title>Oberon‘s Legacy</title>
<author>Corets, Eva</author>
<price>5.95</price>
</book>
<book>
</book>
</bookstore>
4、显示所有数据。
XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
XmlNodeList xnl=xn.ChildNodes;
foreach(XmlNode xnf in xnl)
XmlElement xe=(XmlElement)xnf;
Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
Console.WriteLine(xe.GetAttribute("ISBN"));
XmlNodeList xnf1=xe.ChildNodes;
foreach(XmlNode xn2 in xnf1)
Console.WriteLine(xn2.InnerText);//显示子节点点文本
您可能感兴趣的文章:
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
以上是关于Unity(C#)读写xml文件详解的主要内容,如果未能解决你的问题,请参考以下文章
[Unity3D] 关于txt,xml,json文件的读写,及外部文件(夹)的创建