何惠英,李紀紅 ,俞 妍 ,沈 虹
(軍事交通學院 基礎部,天津 300161)
目前國內常見的 ATM 品牌有 NCR、Diebold、Wincor、Fujitsu、OKI、GRG、Hitachi等等。各廠商都有自己獨特的機芯硬件LOG記錄方式,如使用的文件格式有 XML、TXT、Java運行時序列文件、報文格式等等。 這些文件里記錄了硬件機芯的運行狀態和動作過程,為分析機芯的運行狀況、周期疑問帳(如長短款)提供了比較詳細的輔助記錄,這也是相關維護人員掌握取款機硬件設備運行狀況的依據。
但對于一般自助設備維護人員,解析記錄文件代碼比較困難。文中提供了一種基于python語言的取款機機芯運行記錄文件的中文解析工具,并通過使用python語言的綁定wxpython功能實現GUI界面。同時以Wincor LOG文件為例,說明了如何針對不同廠商的機芯硬件LOG記錄方式編寫記錄文件解析工具的方法,起到了拋磚引玉的作用。
可擴展標記語言 (Extensible Markup Language, XML)[1],用于標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 XML是標準通用標記語言 (SGML)的子集,非常適合Web傳輸。XML提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據[2]。
在Python中提供了許多標準模塊用于處理XML文檔,XML的處理方式有兩大類:SAX(Simple API for XML,XML的簡單 API)和 DOM(Document Object Model,文檔對象模型)[3]。
在Python庫中,xml.dom模塊實現了DOM訪問XML文檔的處理方式[4]。模塊中提供了對樹中節點以及元素訪問的多種方法。另外還提供了xml.dom.mindom模塊來簡化使用DOM處理方式,實現了DOM中的大部分功能。除此之外,還有一個在Python2.5中引入的ElementTree模塊。此模塊提供了一種對于XML文檔的快速處理方式。
除了這些標準庫中自帶的XML處理模塊以外,還有一些第三方提供的優秀XML處理組件,其中比較突出的是lxml,其網址是 http://codspead.net/lxml/。實際上這是一個XML庫的 Python語言綁定。此模塊的使用方式和ElementTree模塊很相似[5]。
本人曾經使用xml.dom.mindom來處理一萬行40列的數據,結果內存占用達到了800 M,后來改用 ElementTree后內存使用改善到50 M左右。和DOM相比,ElementTree模塊提供了一個更輕量級的對象模型,用于以Python處理XML。ElementTree在從頭生成 XML文檔方面和它在操作現有的XML數據方面比較出色[6]。比如,ElementTree使用XPath訪問深層嵌套元素要比手工遞歸搜索容易得多。顯然,在DOM中也可使用XPath,但代價是形成一個過于龐大且不夠統一的API。 ElementTree所有的 Element節點的工作方式是一致的,不像DOM的節點類型那樣“裝飾華麗”。
XML文件記錄了ATM機器硬件的運行情況[4],從中可以查找機器故障的原因,可以查找每筆交易的硬件動作詳情。
XML內容舉例

綜上所述,我們使用 ElementTree模塊來解析 XML文件,下面介紹解析的方法。
在使用前需要先將模塊導入,在 python中使用 import來導入模塊,導入模塊的格式如下:
方式 1)import module_name
方式 2)from module_name import function_name
方式 3)import module_name as your_name
下面使用第3種方式導入ElementTree模塊。
import xml.etree.ElementTree as tree
導入 ElementTree模塊,為了簡短將名字改為 tree,導入模塊之后可以使用parse方法來解析XML文件,語法如下:

如下面一個簡單的方法可以獲得XML元素的所有內容:

注:因為機型不同,XML文件名不同,元素的名稱也不同,所以加了if else判斷。在這里請注意,使用了parse方法和getiterator方法。在最新的 python2.7里getiterator方法已經不再推薦使用,用iter代替,如下在官方文檔中這樣描述:Deprecated since version 2.7:Use method ElementTree.iter()instead.
iter方法的使用說明:iter(tag=None)Creates and returns a tree iterator for the root element.The iterator loops over all elements in this tree,in section order.tag is the tag to look for(default is to return all elements)
由于本分析工具總代碼有近一萬行,在此僅簡單舉例進行示意分析XML文檔的用法。
XML文檔分析完畢后需要將結果顯示出來,本解析工具使用了wxpython的GUI組件進行了各項內容的顯示,如下:
以下是生成基本圖形界面的初始化代碼。

#遍歷一個 XML文件,調用前面介紹的分析 XML文件的方法


XML記錄文件解析過程界面如圖1所示。

圖1 XML記錄文件解析過程界面Fig.1 Interface of XML log files analysis proces
取款機硬件的所有運行狀態反映在取款機的機芯運行記錄文件中,解析LOG文件是維護人員了解硬件設備的運行情況的主要途徑。文中所提供的ATM取款機機芯動作LOG文件解析工具為一般維護人員分析機器狀態提供了便利,使其不再苦惱于機器代碼。同時針對不同廠商不同格式的記錄文件,基于Python語言說明了編寫記錄文件解析工具的方法,起到了拋磚引玉的作用。
[1]孫廣磊.征服Python---語言基礎與典型應用 [M].人民郵電出版社,2007.
[2]Mark Lutz.Programming Python[M].3rd Edition.Publisher:O'Reilly,2011.
[3]孫昊鷹.互聯網全能基礎[M].北京:北京諾亞思網絡開發有限公司,2001.
[4]Gift N,Jones J M.Python在Unix和Linux系統管理中的應用(影印版)[M].北京:開明出版社,2009.
[5]周偉,宗杰.Python開發技術詳解[M].北京:機械工業出版社,2009.
[6]Lutz M.Learning Python 3rd[M].南京:東南大學出版社,2008.