1. 程式人生 > >【20180505】python--repo:manifest_xml學習

【20180505】python--repo:manifest_xml學習

1.概述

在上一篇我們對main.py涉及三種重要資料結構中的一種:all_commands物件列表進行分析學習。本文中我們對另一種資料結構:XmlManifest類進行分析。Xmlmanifest類定義在manifest_xml.py中,是貫穿整個repo工程的最重要資料結構之一(僅次於Project類)。它在main.py中基於repodir路徑資訊來生成物件並賦值給cmd物件的屬性“manifest”,對manifest xml檔案和manifest倉進行管理,併為各個cmd物件的git倉批量操作提供支援。

2.資料結構

XmlManifest類中涉及到對xml格式檔案的解析和處理,因此import xml.dom.minidom模組,並配合xml格式檔案的內容另外定義了_Default和_XmlRemote類來協助管理。

_Default類用於管理xml格式檔案中的default配置資訊,包括預設revision、預設remote和預設sync執行緒數三個屬性。

_XmlRemote類用於管理xml格式檔案中的remote配置資訊,一個xml格式檔案中可能配置有多個remote,每個remote包含命名、fetch下載地址、review提交地址等屬性;同時還提供了 ToRemoteSpec 方法對傳入的某個倉名進行處理返回一個RemoteSpec型別的物件來提供完整的遠端倉資訊(RemoteSpec(self.name, url, self.reviewUrl))。

XmlManifest類用於對manifest xml檔案和manifest倉同時進行管理,其中包含四個重要的屬性,分別是repodir、manifestfile、repoProject和manifestProject。四屬性中repodir是用於類初始化物件的,基於此路徑還會初始化MetaProject型別的兩個物件即repoProject和manifestProject(

MetaProject類是基於Project類繼承而來的,專門用於管理repo倉、maniest倉等特殊的project,本質上與Project類並無明顯區別,參考後續Project類學習)。另外還有多種管理xml格式檔案資料的屬性,如_projects/_remotes/_default/_notice等,這些屬性通過@property的方法實現被其他方法呼叫。

XmlManifest類提供瞭如下方法:Override、Link、Save、Load,分別完成覆蓋、軟連結、儲存、解析xml檔案的功能。其中Load最為複雜,通過呼叫ParseManifest方法進而呼叫ParseRemote、ParseDefault、ParseProject等子方法對xml格式檔案中各型別資料進行解析。

3.主體思路

Override和Link比較簡單就不再贅述,主要分析Save和Load方法的實現思路。

Save方法使用 xml.dom.minidom.Document()物件來建立一個manifest元素作為root根元素,並依次讀取XmlManifest類的default、remote、project等屬性來建立對應元素和通過setAttribute給元素賦值,然後appendchild到root根元素下。最終通過Document()物件的writexml方法寫入新檔案中完成儲存。

Load方法有一個與之對應的Unload方法用於清空XmlManifest類的幾個屬性。Load方法本身則通過呼叫ParseManifest方法完成xml檔案解析。ParseManifest方法使用 xml.dom.minidom.parse(self.manifestFile)方法將xml檔案一次提取出來並從其childNodes中獲取manifest根元素,之後對根元素下所有子節點進行多次遍歷,依次解析remote、default、project等型別資料(前後順序非常重要,remote作為所有資料的基礎需要首先遍歷,default則依賴remote併為project資料提供支援,最後則是解析project資料)。而解析這些不同型別資料所呼叫的子方法ParseRemote、ParseDefault、ParseProject等都是按照從子節點中提取資料和建立對應物件的思路設計,他們分別返回_XmlRemote物件、_Default物件和Project物件等。這些物件則會以字典等方式儲存在XmlManifest類的各屬性中並通過@property的方法實現被其他方法呼叫。

最後需要注意的是,在各類資料解析過程中要時刻保證對獲取資料有效性的校驗,包括資料為空、資料重複、資料無效等異常處理。