您的位置:首页 > 编程语言 > Python开发

[python小记]使用lxml修改xml文件,并遍历目录

2016-03-06 16:20 591 查看
  这次的目的是遍历目录,把目标文件及相应的目录信息更新到xml文件中。在经过痛苦的摸索之后,从python自带的ElementTree投奔向了lxml。而弃用自带的ElementTree的原因就是,namespace。

  XML命名空间

  作用是为避免元素命名冲突,当出现命名冲突的时候,可以使用前缀来避免命名冲突,就如:

<h:table>
<h:tr>
<h:td>App Store</h:td>
<h:td>Google Play</h:td>
</h:tr>
</h:table>


  使用命名空间(Namespaces):

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>


  添加的xmlns属性,就会前缀赋予了一个与某个命名空间相关联的限定名称

  lxml安装:

安装pip

安装setuptools: Windows(Powershell3)输入

> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -


下载lxml.whl,根据python版本选择合适的whl下载:地址

安装wheel

pip install wheel


安装下载好的whl文件

pip install .\lxml-3.5.0-cp34-none-win_amd64.whl


  lxml使用:

  lxml的教程网站为:http://lxml.de/index.html

  使用lxml可以这样import:

from lxml import etree


  导入并解析xml文件:

tree = etree.parse(fileName)


  获取xml的命名空间:

root = tree.getroot()
nsmap = root.nsmap


  如果xml文件使用的默认命名空间:

>>> nsmap
{None: 'http://schemas.microsoft.com/developer/msbuild/2003'}


  要查找某节点,使用到xpath:

def getNode(tree, node):
NS_PREFIX = "default"
root = tree.getroot() nsmap = root.nsmap
nsmap[NS_PREFIX] = nsmap[None]
nsmap.pop(None)
return tree.xpath("//{0}:{1}".format(NS_PREFIX, node), namespaces=nsmap)


  添加子节点:

etree.SubElement(node, tag)


  最后写入到xml文件中:

fileHandler = open(filePath, "wb")
tree.write(fileHandler, encoding="utf-8", xml_declaration=True, pretty_print=True)
fileHandler.close()


  xpath基础

  xpath使用路径表达式来选取xml文档中的节点或节点集。

表达式描述
nodename从当前节点的子节点中,选取tag为nodename的所有节点
/从根节点选取
//任意位置选取
.选取当前节点
..选取父节点
@att选取带属性att的节点
[]谓语
  例子:

tree.xpath("//Folder[@Include]")
#选取带Include属性的Folder节点
tree.xpath("//ItemGroup[./Folder]")
4 tree.xpath("//ItemGroup[Folder]")
#选取含有Folder子节点的ItemGroup节点


  遍历目录:

  遍历目录有两个方法:os.list_dir与os.walk。各自的用例:

import os

def list_dir(rootDir):
for lists in os.listdir(rootDir):
path = os.path.join(rootDir, lists)
print(path)
if os.path.isdir(path):
list_dir(path)

def walk(rootDir):
for root, dirs, files in os.walk(rootDir):
for d in dirs:
print(os.path.join(root, d))
for f in files:
print(os.path.join(root, f))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: