在几个月前我有做过这样的记录,其目的是避免解析 XML 时手工编写太多的代码,造成重复的体力劳动。后来经过一番资料的查找,我发现其实并没有必要做这样的工具,因为 C# 已经为我们提供了更好的解决方案了,就是使用 AttributeXmlSerializer。比如说有下面这样的 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 数据表都需要手工写这样的代码,非常耗时,而且还容易出错。但是使用 AttributeXmlSerializer,就不需要自己编写解析 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 文本序列化成字节流的工具,这样只需要处理字节流即可,免去了分析字符串的过程(任何语言处理字符串都是又慢又耗内存的),一般只是在最后优化时才使用,因为毕竟开发的时候使用文本文件才是最方便的。

goto blog

解析 XML 数据的更多相关文章

  1. iOS解析XML数据

    iOS中解析XML数据的类是  NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...

  2. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  3. 160928、JQuery解析XML数据的demo

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...

  4. 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!

    本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html ☞ ...

  5. JQuery解析XML数据的几个例子

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 第一种方案: <script ty ...

  6. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

  7. 导入libxml.dylib用Google的GDataXML解析XML数据

    1.用Google的GDataXML来解析XML数据,导入libxml.dylib 2.导入libxml.dylib的操作实现,一开始自己总是找不到libxml.dylib文件. 选择其他文件,到路径 ...

  8. 【Android Developers Training】 81. 解析XML数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 使用dom4j中SAXReader解析xml数据

    public ApiConfig(String configFilePath) throws DocumentException{ SAXReader reader = new SAXReader() ...

  10. 160708、JQuery解析XML数据的demo

    用JavaScript解析XML数据是常见的编程任务,JavaScript能做的,JQuery当然也能做.下面我们来总结几个使用JQuery解析XML的例子. 方案1 当后台返回的数据类型是xml对象 ...

随机推荐

  1. Ubuntu下用命令行快速打开各类型文件(转)

    nautilus /media/pm/文档/book/system/必读nautilus /media/pm/文档/book/android/ndk 内核/framerwork/android wai ...

  2. android5.1 Recovery添加从U盘升级功能【转】

    本文转载自:http://blog.csdn.net/tfslovexizi/article/details/73835594 之前看到过一个人写了4.4上添加U盘升级功能的博客http://blog ...

  3. What is a good buffer size for socket programming?

    http://stackoverflow.com/questions/2811006/what-is-a-good-buffer-size-for-socket-programming 问题: We ...

  4. http协议的MP4文件播放问题的分析

    现在手上有两个链接 (1) http://202.108.16.173/cctv/video/8C/35/EB/E8/8C35EBE84E7B483C8741CF9A60154993/gphone/4 ...

  5. 杂项-QXM:CFA(特许金融分析师)

    ylbtech-杂项-QXM:CFA(特许金融分析师) 1.返回顶部 1. CFA是“特许金融分析师”(Chartered Financial Analyst)的简称,它是证券投资与管理界的一种职业资 ...

  6. bzoj4753

    bzoj4753 树形dp+01分数规划 这是一个典型的树形背包+01分数规划.看见分数形式最大就应该想到01分数规划. 于是套用分数规划,每次用树形背包检验. 首先这是一棵树,不是一个森林,所以我们 ...

  7. 利用【监听器】动态加载Log4j配置文件

    转自:https://veromca273.iteye.com/blog/1889304 1 创建监听器: public class LogListener implements ServletCon ...

  8. PCB genesis短槽加引导孔实现方法

    一.何为短槽 短槽通常定义:槽长小于2倍槽宽      如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...

  9. RocketMQ(2)

    1. 消费端集群消费(负载均衡) 示例代码: /** * Producer,发送消息 * */ public class Producer { public static void main(Stri ...

  10. 对“空引用”说bye-bye

    大家可能经常遇到这种情况:当一个对象为null时,调用这个对象的方法或者属性时,就会报错:“Object reference not set to an instance of an object.” ...