[python小记]使用lxml修改xml文件,并遍历目录
这次的目的是遍历目录,把目标文件及相应的目录信息更新到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))
[python小记]使用lxml修改xml文件,并遍历目录的更多相关文章
- 面试官问我:如何在 Python 中解析和修改 XML
摘要:我们经常需要解析用不同语言编写的数据.Python提供了许多库来解析或拆分用其他语言编写的数据.在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML. 本文分享 ...
- MyEclipse如何修改XML文件默认行宽
1.MyEclipse如何修改XML文件默认行宽 Windows--->Preferences--->搜索xml--->XML--->XML Source--->Form ...
- MyEclipse如何修改XML文件默认打开的编辑器
1.MyEclipse如何修改XML文件默认打开的编辑器 Windows--->Preferences--->General--->Editors--->File Associ ...
- Java 操纵XML之修改XML文件
Java 操纵XML之修改XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...
- python中用ElementTree.iterparse()读取xml文件中的多层节点
我在使用Python解析比较大型的xml文件时,为了提高效率,决定使用iterparse()方法,但是发现根据网上的例子:每次if event == 'end':之后elem.clear()或者是每次 ...
- Java&Xml教程(七)使用JDOM修改XML文件内容
JDOM提供了非常灵活的方式操作XML文件,使用JDOM非常简单而且代码简洁可读性强.前面我们学习了如何使用JDOM解析XML文件,本节介绍如何使用JDOM修改XML文件内容. 在这个教程中,我们准备 ...
- Java&Xml教程(三)使用DOM方式修改XML文件内容
DOM解析方式也可用于修改XML数据,我们可以使用它完成新增元素.删除元素.修改元素值.修改元素属性等操作. 我们的XML文件,内容如下: employee.xml <?xml version= ...
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- python实现随机复制若干个文件到新目录
python实现随机复制若干个文件到新目录 1说明 1.1 目的 随机选择一个文件下的若干个文件,并将文件复制到新文件夹下 1.2 要求 需要将random_select_and_copy_file. ...
随机推荐
- 为什么控制台console.log一个值,总是会多一个undefined
我们发现在浏览器控制台打印东西的时候,末尾总是会莫名其妙多出一个undefined? 这是为什么呢? 大胆猜测一下,应该执行的函数没有返回值,而浏览器默认要打印出执行函数的返回值,才会打印undefi ...
- Java中设置classpath、path、JAVA_HOME的作用?
1.classpath是用来找编译后的class文件的,操作系统或者编译器等会在这些目录下寻找对应的.class文件 2.path时用来找命令行执行文件的,操作系统或者其他软件会在这些目录下找对应的命 ...
- shell 脚本中执行mysql语句
通过hash建表之后,表的数据量巨大2048,那怎么去验证表是否建成功呢? 逻辑生成表名这部分就不写了.只要能建表成功,这部分的脚本肯定是有的.那么怎么在shell中执行selec查询并返回呢 只要在 ...
- Neural Networks for Machine Learning by Geoffrey Hinton (4)
一种能够学习家谱关系的简单神经网络 血缘一共同拥有12种关系: son, daughter, nephew, niece, father, mother, uncle, aunt, brother, ...
- ylbtech-LanguageSamples-SimpleVariance
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-SimpleVariance 1.A,示例(Sample) 返回顶部 SimpleVar ...
- pyPdf - 用Python方便的处理PDF文档
pyPdf库 ( http://pybrary.net/pyPdf/ ) ,操作起来相当直接易懂,把代码贴在这儿,做个记录. 1 from pyPdf import PdfFileWriter, P ...
- 流畅的python第一章python数据模型学习记录
python中有些特殊的方法,以双上下划线开头,并以双下划线结束的方法.如__getitem__,这些方法是特殊的方法,供python解释权内部使用,一般来说不需要调用 还有一种是以双下划线开头的,如 ...
- Jquery事件冒泡
事件冒泡 什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么 ...
- Vue-router路由基础总结(二)
一.命名路由 有时我们通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候.你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称. 我 ...
- vmware虚拟机 C硬盘空间 无损扩容 新测
摘自: http://hi.baidu.com/y276827893/item/78a351f427726549932af214 其实上面一步的话, 虚拟机设置 里选择磁盘,实用工具里也有这个功能的. ...