此次的目的是遍歷目錄,把目標文件及相應的目錄信息更新到xml文件中。在通過痛苦的摸索以後,從python自帶的ElementTree投奔向了lxml。而棄用自帶的ElementTree的緣由就是,namespace。html
做用是爲避免元素命名衝突,當出現命名衝突的時候,能夠使用前綴來避免命名衝突,就如:node
<h:table> <h:tr> <h:td>App Store</h:td> <h:td>Google Play</h:td> </h:tr> </h:table>
使用命名空間(Namespaces):python
<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屬性,就會前綴賦予了一個與某個命名空間相關聯的限定名稱shell
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
pip install wheel
pip install .\lxml-3.5.0-cp34-none-win_amd64.whl
lxml的教程網站爲:http://lxml.de/index.htmlbootstrap
使用lxml能夠這樣import:網站
from lxml import etree
導入並解析xml文件:ui
tree = etree.parse(fileName)
獲取xml的命名空間:spa
root = tree.getroot()
nsmap = root.nsmap
若是xml文件使用的默認命名空間:code
>>> nsmap {None: 'http://schemas.microsoft.com/developer/msbuild/2003'}
要查找某節點,使用到xpath:orm
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使用路徑表達式來選取xml文檔中的節點或節點集。
表達式 | 描述 |
nodename | 從當前節點的子節點中,選取tag爲nodename的全部節點 |
/ | 從根節點選取 |
// | 任意位置選取 |
. | 選取當前節點 |
.. | 選取父節點 |
@att | 選取帶屬性att的節點 |
[] | 謂語 |
例子:
1 tree.xpath("//Folder[@Include]") 2 #選取帶Include屬性的Folder節點 3 tree.xpath("//ItemGroup[./Folder]")
4 tree.xpath("//ItemGroup[Folder]") 5 #選取含有Folder子節點的ItemGroup節點
遍歷目錄有兩個方法:os.list_dir與os.walk。各自的用例:
1 import os 2 3 def list_dir(rootDir): 4 for lists in os.listdir(rootDir): 5 path = os.path.join(rootDir, lists) 6 print(path) 7 if os.path.isdir(path): 8 list_dir(path) 9 10 def walk(rootDir): 11 for root, dirs, files in os.walk(rootDir): 12 for d in dirs: 13 print(os.path.join(root, d)) 14 for f in files: 15 print(os.path.join(root, f))