在有些项目中,有时候会用到XML的读写功能,用C、C++去编辑不太方便,但是使用Python去做就很方便了。这边仅是初次编写,给个简单示例,做抛砖引玉之用,欢迎大家在此基础进行扩展、并使用。
1.库引用
from xml.etree.ElementTree import *
2.功能集成代码
如下部分代码,仅仅是对我用到了的Element部分功能做了初步的封装,这样在后续使用起来更为方便,也可以做进一步的扩展。
newItem是新建一个element,并为其赋值,这个在Python的官方文档里介绍的比较详细,可以参考,另外在使用其作为测试例子时,同时可以使用dump接口打印出自己的编辑的xml文件;
addchild则是把element加入到tree中,Python比较简单,C++中也有类似的接口;
setItemAttrib这个可以对element的属性进行删除,修改;
class ZElement:
def newItem(self, tag, text=None):
element = Element(tag)
element.text = text
return element
def addChild(self, item, subItem):
item.append(subItem)
def setItemAttrib(self, items, kvMap, isDel=False):
for item in items:
for key in kvMap:
if isDel:
if key in item.attrib:
del item.attrib[key]
else:
items.set(key, kvMap.get(key))
进一步的集成code如下所示:
class ZXML(ZElement):
def __init__(self):
self._root = ElementTree()
def setRoot(self, items):
self._root = ElementTree(items)
def _indent(self, items, level=0):
i = "\n" + level * "\t"
if len(items):
if not items.text or not items.text.strip():
items.text = i + "\t"
if not items.tail or not items.tail.strip():
items.tail = i
for item in items:
self._indent(item, level + 1)
if not items.tail or not items.tail.strip():
items.tail = i
else:
if level and (not items.tail or not items.tail.strip()):
items.tail = i
def parse(self, path):
self._root.parse(path)
return self._root
def save(self, path):
self._root.write(path, encoding="utf-8", xml_declaration=True,
short_empty_elements=False)
def format(self, items):
self._indent(items)
def setItemText(self, item, text):
if type(item) == str:
items = self._root.findall(item)
for it in items:
it.text = text
else:
item.text = text
def findItems(self, itemPath):
if self._root is not None:
return self._root.findall(itemPath)
def deleteItems(self, itemPath, subTag):
items = self.findItems(itemPath)
for item in items:
for child in list(item):
if child.tag == subTag:
item.remove(child)
return items
上述代码比较简单,满足增、删、改没有问题的;_intent这个是对xml进行缩进操作;其它接口极为简单,我就不做说明。
下面就一个例子进行说明(如下是一个示例XML文件,保存为test.proj):
<?xml version='1.0' encoding='utf-8'?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
<SchemaVersion>1.1</SchemaVersion>
<Targets>
<Target>
<TargetOption>
<TargetArmAds>
<LDads>
<Misc>--keep</Misc>
</LDads>
</TargetArmAds>
</TargetOption>
<Groups></Groups>
</Target>
</Targets>
</Project>
对XML文件自动化修改后,如下所是:
<?xml version='1.0' encoding='utf-8'?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
<SchemaVersion>1.1</SchemaVersion>
<Targets>
<Target>
<TargetOption>
<TargetArmAds>
<LDads>
<Misc>--keep PatchM_VCODEC_Adapter_DacDataIn4TEST</Misc>
</LDads>
</TargetArmAds>
</TargetOption>
<Groups>
<Group>
<GroupName>PATCH_Add_Linein_HIFAlgo_by_WDX_LCY1</GroupName>
<Files>
<File>
<FileName>PatchM_VCODEC_Adapter_DacDataIn4TEST.c</FileName>
<FileType>1</FileType>
<FilePath>.\app\PATCH_Add_Linein_HIFAlgo_by_WDX_LCY\PatchM_VCODEC_Adapter_DacDataIn4TEST.c</FilePath>
</File>
</Files>
</Group>
</Groups>
</Target>
</Targets>
</Project>
那是如何实现上述功能的呢,请查看如下如下Code:
if __name__ == "__main__":
zxml = ZXML()
zxml.parse(r'./src/test.proj')
items = zxml.deleteItems("Targets/Target/Groups", 'Group')
FileName = zxml.newItem("FileName", "PatchM_VCODEC_Adapter_DacDataIn4TEST.c")
FileType = zxml.newItem("FileType", "1")
FilePath = zxml.newItem("FilePath",
r".\app\PATCH_Add_Linein_HIFAlgo_by_WDX_LCY\PatchM_VCODEC_Adapter_DacDataIn4TEST.c")
file = zxml.newItem("File")
zxml.addChild(file, FileName)
zxml.addChild(file, FileType)
zxml.addChild(file, FilePath)
files = zxml.newItem("Files")
zxml.addChild(files, file)
GroupName = zxml.newItem("GroupName", "PATCH_Add_Linein_HIFAlgo_by_WDX_LCY1")
Group = zxml.newItem("Group")
zxml.addChild(Group, GroupName)
zxml.addChild(Group, files)
zxml.addChild(items[0], Group)
zxml.format(items[0])
zxml.setItemText('Targets/Target/TargetOption/TargetArmAds/LDads/Misc', '--keep PatchM_VCODEC_Adapter_DacDataIn4TEST')
zxml.save("./src/out.proj")
最终完成也是非常的简单,对简单的XML修改,完全可以满足,前后对比文件如下所示: