【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的方法实现被其他方法调用。

最后需要注意的是,在各类数据解析过程中要时刻保证对获取数据有效性的校验,包括数据为空、数据重复、数据无效等异常处理。

猜你喜欢

转载自blog.csdn.net/kefeiliu/article/details/80203412