使用c# attribute 解析XML文件
2016-05-15 19:40
651 查看
<span style="background-color: rgb(0, 0, 0);"><?xml version="1.0" encoding="us-ascii"?> <cats> <item animType="Loop" color="White"> <saying>I am a white cat</saying> </item> <item animType="Wrap" color="Black"> <saying>I am a black cat</saying> </item> </cats></span>
以前在游戏中使用这个 XML 的时候都是手工解析的,伪代码如下。
XmlDocument doc = new XmlDocument(); doc.Load(xmlStr); XmlNodeList itemNodes = doc.SelectNodes("cats/item"); CatCollection cats = new CatCollection(); foreach(var itemNode in itemNodes) { Cat cat = new Cat(); // 读取节点数据赋值给 cat }
每一张 XML 数据表都需要手工写这样的代码,非常耗时,而且还容易出错。但是使用
Attribute和
XmlSerializer,就不需要自己编写解析
XML 数据的代码了,只需要定义好 XML 数据表对应的 Class 即可。
[XmlRoot("cats")] public class CatCollection { [XmlElement("item")] public Cat[] Cats { get; set; } } [XmlRoot("cat")] public class Cat { [XmlAttribute("color")] public string Color { get; set; } [XmlElement("saying")] public string Saying { get; set; } [XmlAttribute("animType")] public AnimationType animationType; }
然后像下面这样编写解析 XML 的代码。
XmlSerializer serializer = new XmlSerializer(typeof(CatCollection)); CatCollection cc = serializer.Deserialize(xmlStr) as CatCollection;
如果将上面代码利用泛型封装好,我们所有的 XML 解析代码都可以统一成一个函数,再也不费时费力手动解析了。至于如何生成带有 Attribute 的 Class,应该也有很多办法,似乎 XSD 就可以(我没有测试过),实在不行自己写工具也不是难事。
最后我使用了三种加载 XML 的方式对一张大型的 XML 数据表(977kb),在 IOS 设备上进行了性能测试。测试设备 Iphone6S,从一个空场景启动,并开始解析 XML。
解析方式 | 内存(Mono) | 耗时(Mono) | 内存(IL2CPP) | 耗时(IL2CPP) |
---|---|---|---|---|
XmlDocument | 45MB | 700ms | 60MB | 2350ms |
XmlSerializer | 37MB | 550ms | 41MB | 1680ms |
TinyBinaryXml | 33MB | 80ms | 37MB | 202ms |
XmlSerializer比起我们自己手工解析 XML 数据反而有一定的优势,而且使用起来更方便快捷。奇怪的是
IL2CPP 不管从内存还是耗时上都要差于 Mono。至于 TinyBinaryXml 是什么,它是一个将 XML 文本序列化成字节流的工具,这样只需要处理字节流即可,免去了分析字符串的过程(任何语言处理字符串都是又慢又耗内存的),一般只是在最后优化时才使用,因为毕竟开发的时候使用文本文件才是最方便的。
相关文章推荐
- XML 与 JSON 优劣对比
- As3.0 xml + Loader应用代码
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- 实例解析Ruby程序中调用REXML来解析XML格式数据的用法
- Ruby中XML格式数据处理库REXML的使用方法指南
- C#针对xml基本操作及保存配置文件应用实例
- Ruby使用REXML库来解析xml格式数据的方法
- Ruby程序中创建和解析XML文件的方法
- Ruby的XML格式数据解析库Nokogiri的使用进阶
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- EBS xml publisher中文乱码问题及解决办法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总
- SQL Server中的XML数据进行insert、update、delete
- Ruby中使用Nokogiri包来操作XML格式数据的教程
- C#实现将文件转换为XML的方法