python XML梳理


導入ElementTree模塊

import xml.etree.ElementTree as ET

為了創建一個element實例,使用Element 構造函數或者SubElement()工廠函數。
  ET.Element():通常用於創建根節點
  ET.SubElement(): 用於創建子節點

ElementTree 類可以用來包裹一個element結構,用於與XML進行相互轉換。

通常使用:
  ElementTree 遍歷整個文檔。
  Element遍歷單獨的節點或者子節點通常使用 。

Element:方法以及函數
		tag = None
		attrib = None
		text = None
		tail = None
    def append(self, subelement):
    def extend(self, elements):
    def insert(self, index, subelement):
    def remove(self, subelement):
    def getchildren(self):
    def find(self, path, namespaces=None):
    def findtext(self, path, default=None, namespaces=None):
    def findall(self, path, namespaces=None):
    def iterfind(self, path, namespaces=None):
    def clear(self):
    def get(self, key, default=None):
    def set(self, key, value):
    def keys(self):
    def items(self):
    def iter(self, tag=None):
    def itertext(self):
ElementTree:常用函數
    def getroot(self): 
    def parse(self, source, parser=None):  #打開xml文件
    def iter(self, tag=None):
    def getiterator(self, tag=None):
    def find(self, path, namespaces=None):
    def findtext(self, path, default=None, namespaces=None):
    def findall(self, path, namespaces=None):
    def iterfind(self, path, namespaces=None):
    def write(self, file_or_filename,
              encoding=None,
              xml_declaration=None,
              default_namespace=None,
              method=None, *,
              short_empty_elements=True):

一、解析(獲取到根節點[Element])
1、str方式:
  node = ET.XML(str_xml) = ET.fromstring(str_xml) #獲取到根節點 (Element)
  #XML()=fromstring()
2、文件方式:
  result = ET.parse("file.xml") # 打開文件,(ElementTree)
  root = result.getroot() # 獲取到根節點,(Element)

二、修改(使用[Element]型對象)
  tag、attrib、text、find、iter、remove、set......

三、重新寫入文件

寫入必須使用ElementTree對象調用write方法操作。
  1、str解析方式寫入文件

    node = ET.XML(str_xml) #獲取到根節點
    ...操作
    et = ET.ElementTree(root) #創建一個tree
    et.write("file.xml", encoding="utf-8", xml_declaration=True) #寫入文件

  2、文件方式寫回文件

  result = ET.parse("file.xml") #獲取Tree
  root = result.getroot() #獲取到根節點
  ...修改
  result.write("file.xml", encoding="utf-8", xml_declaration=True) 寫回文件

四、創建XMl文件

  Element #創建根節點
  SubElement # 創建子節點
  ElementTree # 創建tree,用於寫入文件

五、縮進

導入minidom模塊
  from xml.dom import minidom
在寫入文件是不在使用tree,使用下面的代碼(其中的root是Element跟節點)

  c = minidom.parseString(ET.tostring(root, encoding="Utf-8")).toprettyxml(indent="\t")
  f = open("file.xml", "w", encoding="utf-8")   f.write(c)   f.close()

對以上的操作可以定義一個函數使用:

  def wrap(root):
    a = ET.tostring(root, encoding="Utf-8")
    b = minidom.parseString(a)
    c = b.toprettyxml(indent="\t")
    return c

六、命名空間

  1、注冊命名空間:

    ET.register_namespace("com", "http://www.ehaomiao.com")

  2、調用(在需要使用命名空間的標簽前加入,格式為{})如下:

    School = ET.Element("{http://www.ehaomiao.com}school")
    University = ET.SubElement(School, "{http://www.ehaomiao.com}University", attrib={"time": "4"})

  3、結果
    根節點的顯示如下:(多了一句xmlns:com="http://www.ehaomiao.com"這樣的語句)
      <com:school xmlns:com="http://www.ehaomiao.com">
    在每個調用命名空間的節點顯示如下:(多了一個com:的標志)
      <com:University time="4">

七、重要

在操作過程中如遇到有關於對象類型的問題,可以使用type()方法查看一下。

八、創建XML文件練習

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/12/1 0001 14:07
# @Author  : ming
import xml.etree.ElementTree as ET
from xml.dom import minidom ET.register_namespace("com", "http://www.ehaomiao.com") # 注冊命名空間  School = ET.Element("{http://www.ehaomiao.com}school") # 調用命名空間 University = ET.SubElement(School, "{http://www.ehaomiao.com}University", attrib={"time": "4"}) d1 = ET.SubElement(University, "d1") # University是其父親節點 d1.text = "大一" d2 = ET.SubElement(University, "d2") d2.text = "大二" d3 = ET.SubElement(University, "d3") d3.text = "大三" d4 = ET.SubElement(University, "d4") d4.text = "大四" High_school = ET.SubElement(School, "{http://www.ehaomiao.com}High_school", attrib={"time": "3"}) g1 = ET.SubElement(High_school, "g1") g1.text = "高一" g2 = ET.SubElement(High_school, "g2") g2.text = "高二" g3 = ET.SubElement(High_school, "g3") g3.text = "高三" middle_school = ET.SubElement(School, "{http://www.ehaomiao.com}middle_school", attrib={"time": "3"}) c1 = ET.SubElement(middle_school, "c1") c1.text = "初一" c2 = ET.SubElement(middle_school, "c2") c2.text = "初一" c3 = ET.SubElement(middle_school, "c3") c3.text = "初一" # 寫入文件無縮進,寫入到file1.xml 文件中 et = ET.ElementTree(School) et.write("file1.xml", encoding="utf=8", xml_declaration=True) def wrap(root): """ 將XML文件的所有節點添加換行符 :param root: 根節點[Element類型] :return: 返回添加了縮進的字符串 """ a = ET.tostring(root, encoding="Utf-8") b = minidom.parseString(a) c = b.toprettyxml(indent="\t") return c # 寫入文件有縮進,寫入到file2.xml 文件中 a = wrap(School) f = open("file2.xml", "w", encoding="utf-8") f.write(a) f.close()
<?xml version="1.0" ?>
<com:school xmlns:com="http://www.ehaomiao.com">
    <com:University time="4">
        <d1>大一</d1>
        <d2>大二</d2>
        <d3>大三</d3>
        <d4>大四</d4>
    </com:University>
    <com:High_school time="3">
        <g1>高一</g1>
        <g2>高二</g2>
        <g3>高三</g3>
    </com:High_school>
    <com:middle_school time="3">
        <c1>初一</c1>
        <c2>初一</c2>
        <c3>初一</c3>
    </com:middle_school>
</com:school>
file2.xml
<?xml version='1.0' encoding='utf=8'?>
<com:school xmlns:com="http://www.ehaomiao.com"><com:University time="4"><d1>大一</d1><d2>大二</d2><d3>大三</d3><d4>大四</d4></com:University><com:High_school time="3"><g1>高一</g1><g2>高二</g2><g3>高三</g3></com:High_school><com:middle_school time="3"><c1>初一</c1><c2>初一</c2><c3>初一</c3></com:middle_school></com:school>
file1.xml

 


免責聲明!

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



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