解析 XML 資料

2022-09-15 16:30:14 字數 1966 閱讀 5241

在幾個月前我有做過這樣的記錄,其目的是避免解析 xml 時手工編寫太多的**,造成重複的體力勞動。後來經過一番資料的查詢,我發現其實並沒有必要做這樣的工具,因為 c# 已經為我們提供了更好的解決方案了,就是使用attributexmlserializer。比如說有下面這樣的 xml。

<?xml version="1.0" encoding="us-ascii"?>

i am a white cat

i am a black cat

以前在遊戲中使用這個 xml 的時候都是手工解析的,偽**如下。

xmldocument doc = new xmldocument();

doc.load(xmlstr);

xmlnodelist itemnodes = doc.selectnodes("cats/item");

catcollection cats = new catcollection();

foreach(var itemnode in itemnodes)

每一張 xml 資料表都需要手工寫這樣的**,非常耗時,而且還容易出錯。但是使用attributexmlserializer,就不需要自己編寫解析 xml 資料的**了,只需要定義好 xml 資料表對應的 class 即可。

[xmlroot("cats")]

public class catcollection

}[xmlroot("cat")]

public class cat

[xmlelement("saying")]

public string saying

[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解析資料

import gdataxmlnode.h 引第三方標頭檔案 import jsonkit.h 引第三方標頭檔案 inte ce rootviewcontroller uiviewcontroller 協議 property nonatomic,retain nsmutablearray allst...

解析XML資料

其實就是已有的工具使用方法,特別白痴的做法,記住就好了。貴在實際專案中融會貫通 private void par mlwithpull string xmldata else if name equals nodename else if verson equals nodename break 解...

XML資料解析

結合網上的例子,記錄一下自己過程中的坑 建立乙個解析器物件xmlpullparser 使用xmlpullparser.setinput 方法設定解析器的輸入 通過判斷事件型別,迴圈呼叫next 方法獲得解析的資料 南寧 10 01 2982 東南風06 09 19 35 8日星期三 高溫 34 低溫...