python讀取/創建XML文件


Python中定義了很多處理XML的函數,如xml.dom,它會在處理文件之前,將根據xml文件構建的樹狀數據存在內存。還有xml.sax,它實現了SAX API,這個模塊犧牲了便捷性,換取了速度和減少內存占用。

本文將要說明的是xml.tree.ElementTree的使用。與DOM比較,它使用起來更快更方便,和SAX比較呢,性能相仿,但使用起來更快捷。

ET(ElementTree)提供了兩個對象:ElementTree和Element

ElementTree:將整個XML轉化為樹,對整個XML文檔進行操作(讀取,寫入,查找等)一般在ElementTree層面進行。

Element:代表樹上單個節點,對單個XML元素及其子元素進行操作,則是在Element層面進行。

1)加載整個文檔(demo.xml):

  import xml.etree.ElementTree as ET

  tree = ET.ElementTree(file="demo.xml")

2)獲取根元素

  root = tree.getroot()

  根元素是一個Element對象,它具有以下屬性:

  root.tag:返回元素的標簽名

  root.attrib:以字典形式返回屬性名和值

3)根元素本身就是一個可迭代對象,和其他Element對象一樣,也具備直接遍歷子元素的接口

  for child in root:

    print(child.tag, child.attrib)

  也可以通過索引來訪問特定的子元素 root[1].tag

4)查找需要的元素:find,findall, findText,iterfind等

  find(tagName):總是返回第一個匹配的元素

  findall(tagName):返回當前元素下一級所有匹配的元素列表

  findtext:

  iterfind(tagName):作用和findall一樣,但是它返回的是一個生成器。

4)要想找到當前元素下所有元素,而不是只找到下一級元素

  list(root.iter())  #列出根元素下所有子節點列表

  list(root.iter(tagName))  # 列出所有標簽名為tagName的子節點

5)正則表達式的使用:

  *:所有 ---------> root.find("Menues/*") 查找路徑Menus下面的所有子節點

  .:當前元素---------->root.find(./*)  查找當前元素下的所有子節點

  //:------------> root.findall(".//Menu"):查找當前目錄下任意層級的標簽名為Menu的子元素

  ..:------------>root.findall(".//Menu/.."):查找當前目錄下任意層級的標簽名為Menu的子元素的父元素

  [@attrib]:根據指定的屬性搜索元素

  [@attrib='value']:根據給定屬性名搜索元素--------->root.findall("Tab[@type='subabsent']"):找到所有type為subabsent的Tab標簽

  [tag]:----->root.findall("Tab[Menues]"):找到包含子元素為Menues的Tab標簽

  [tag='text']:---------->root.findall("Tab[Menues=5]"):找到包含Menues標簽,且Menues標簽中間text值為5的Tab元素

  [position]:----->根據元素位置找相應的元素,從1開始: root.findall("Tab[1]")  root.findall("Tab[last()-1]"):找到倒數第二個元素

  

 寫入XML文件:

  調用ElementTree的write函數:ElementTree.write(file)

  def pretty(e,level=0):

    # 格式化xml文件

    if len(e)>0:

      e.text = "\n"+"\t"*(level+1)

      for child in e:

        pretty(child,level+1)

      child.tail = child.tail[:-1]

    e.tail = "\n"+"\t"*level

  

  把如下CSV文件寫入XML文件

  

---》

        

  import xml.etree.ElementTree as ET

  from xml.etree.ElementTree import ElementTree,Element

  import csv

  def WriteXML(csvfile):

    # 把CSV文件寫入到xml文件

    with open(csvfile,"r") as rf:

      reader = csv.reader(rf)

      header = next(reader)

      root = Element("Data")

      for row in reader:

        eRow = Element("Row")

        root.append(eRow)

        for tag, text in zip(header, row):

          e = Element(tag.strip())

          e.text = text.strip()

          eRow.append(e)

   pretty(root)

   return ElementTree(root)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM