解析 XML 数据
在几个月前我有做过这样的记录,其目的是避免解析 XML 时手工编写太多的代码,造成重复的体力劳动。后来经过一番资料的查找,我发现其实并没有必要做这样的工具,因为 C# 已经为我们提供了更好的解决方案了,就是使用 Attribute 和 XmlSerializer。比如说有下面这样的 XML。
<?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>
以前在游戏中使用这个 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 数据的更多相关文章
- iOS解析XML数据
iOS中解析XML数据的类是 NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 160928、JQuery解析XML数据的demo
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html ☞ ...
- JQuery解析XML数据的几个例子
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 第一种方案: <script ty ...
- (四)SAX方式解析XML数据
SAX方式解析XML数据 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...
- 导入libxml.dylib用Google的GDataXML解析XML数据
1.用Google的GDataXML来解析XML数据,导入libxml.dylib 2.导入libxml.dylib的操作实现,一开始自己总是找不到libxml.dylib文件. 选择其他文件,到路径 ...
- 【Android Developers Training】 81. 解析XML数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 使用dom4j中SAXReader解析xml数据
public ApiConfig(String configFilePath) throws DocumentException{ SAXReader reader = new SAXReader() ...
- 160708、JQuery解析XML数据的demo
用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...
随机推荐
- YTU 2760: 字符串---首字母变大写
2760: 字符串---首字母变大写 时间限制: 1 Sec 内存限制: 128 MB 提交: 343 解决: 136 题目描述 输入一行英文句子,将每个单词的第一个字母改成大写字母. 输入 一个 ...
- WPF,Silverlight与XAML读书笔记(3) - 标记扩展
hystar的.Net世界 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 103 文章- 0 评论- 107 WPF,Silverlight与XAML读书笔记(3) - 标记扩展 说 ...
- 描述一下ArrayList和LinkedList各自实现和区别
ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下: 一.同步性 ArrayList,LinkedList是不同步 ...
- bzoj1061&&bzoj3256
http://www.lydsy.com/JudgeOnline/problem.php?id=1061 单纯形... 先开始我不知道对偶,看着代码不知所措,并不能懂他们写的是什么... 单纯形的标准 ...
- [Swift通天遁地]七、数据与安全-(15)使用单元测试进行代码的性能分析
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Java根据年度将数据分组
现在有这么一组数据 code name year 45615654 x1 ...
- assistant: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by
[oracle@oracledb button]$ assistantassistant: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' no ...
- 【LeetCode】-- 73. Set Matrix Zeroes
问题描述:将二维数组中值为0的元素,所在行或者列全set为0:https://leetcode.com/problems/set-matrix-zeroes/ 问题分析:题中要求用 constant ...
- python基础篇(一)-------- 字符串的操作
1.字符串的常用操作: 已知字符串:str = "hello world zhangsan and zhangsan" 1.字符串的长度:len(str) 2.查看字符串的索引值: ...
- Puppeteer——自动化脚本设计
我被分配了一个繁琐的任务,就是要给100个相同的站点做同样的配置.曾经就有做过相同的事,那时还不会写脚本,全靠手动配置.机械的配置了两天的时间,身体感觉被掏空.所以这次我决定还是写一个脚本自动的进行配 ...