Python学习笔记之XML读、写

在有些项目中,有时候会用到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修改,完全可以满足,前后对比文件如下所示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值