Python學習——xml模組
一、簡述
xml即可擴充套件標記語言,它可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。它用於不同語言或者程式之間進行資料交換,從這點上講與json差不多,只不過json看起來更美觀、可讀性更強。另外json誕生的時間並不是很久,在json出現以前,資料交換隻能選擇xml,即便是json已經在大面積使用的現在,xml依然被廣泛使用,java專案中隨處可見啊。
二、xml的結構
先來看一個栗子把:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2018</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2018</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
OK,從結構上,它很像我們常見的HTML超文字標記語言。但他們被設計的目的是不同的,超文字標記語言被設計用來顯示資料,其焦點是資料的外觀。它被設計用來傳輸和儲存資料,其焦點是資料的內容。
結構特徵解讀如下:
它由成對的標籤組成
一級標籤稱為根節點,其他級別的標籤稱為節點標籤可以有屬性
標籤對可以嵌入資料 2011
嵌入的資料即為節點的值
標籤可以嵌入子標籤(具有層級關係)
三、通過python操作xml檔案
就以上面的xml檔案為例來看看怎麼通過python操作xml檔案把。
3.1 讀取xml檔案內容
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xml.etree.ElementTree as et
tree = et.parse('test.xml')
root = tree.getroot() # 獲取根節點
print(root.tag) # 列印根節點
for child in root:
print('-----------')
print('\t', child.tag, child.attrib) # 分別列印子節點名稱和子節點屬性
for i in child:
print('\t\t', i.tag, i.text, i.attrib) # 列印子節點下節點的節點名、節點值和屬性
# 只遍歷year節點
for i in child.iter('year'):
print('\t\t\t', i.tag, i.text)
print('')
for node in root.iter('year'):
print(node.tag, node.text)
輸出:
data
-----------
country {'name': 'Liechtenstein'}
rank 2 {'updated': 'yes'}
year 2008 {}
gdppc 141100 {}
neighbor None {'direction': 'E', 'name': 'Austria'}
neighbor None {'direction': 'W', 'name': 'Switzerland'}
year 2008
-----------
country {'name': 'Singapore'}
rank 5 {'updated': 'yes'}
year 2018 {}
gdppc 59900 {}
neighbor None {'direction': 'N', 'name': 'Malaysia'}
year 2018
-----------
country {'name': 'Panama'}
rank 69 {'updated': 'yes'}
year 2018 {}
gdppc 13600 {}
neighbor None {'direction': 'W', 'name': 'Costa Rica'}
neighbor None {'direction': 'E', 'name': 'Colombia'}
year 2018
year 2008
year 2018
year 2018
說明:
getroot()用於返回根節點,tag返回節點名,attrib返回節點屬性,text返回節點的值;
只返回某個節點的資訊,使用iter(節點名)即可。
3.2 修改xml檔案內容
"""修改xml檔案內容"""
import xml.etree.ElementTree as et
tree = et.parse('test.xml')
root = tree.getroot()
print(type(root.iter('year')))
for node in root.iter('year'):
new_year = int(node.text) + 1
node.text = str(new_year) # 修改節點值
node.tag = 'next_year' # 修改節點名稱
node.set('Pumpkin', 'handsome') # 修改節點屬性
tree.write('test2.xml') # 儲存檔案
注意最後一步儲存操作不能漏掉!
修改的實際效果如下:
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<next_year Pumpkin="handsome">2009</next_year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<next_year Pumpkin="handsome">2019</next_year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<next_year Pumpkin="handsome">2019</next_year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
3.3 刪除xml節點
import xml.etree.ElementTree as et
tree = et.parse('test.xml')
root = tree.getroot()
for country in root.findall('country'): # 查詢第一層子節點
rank = int(country.find('rank').text) # 查詢子節點下的子節點
if rank > 50:
root.remove(country) # 刪除符合條件的節點
tree.write('test2.xml')
注意:
findall()從根節點只能根據第一層的子節點名查詢,並且返回第一層子節點的記憶體地址;
刪除節點用remove()方法;
刪除後需要write儲存。
3.4 建立新的xml檔案
import xml.etree.ElementTree as et
# 建立根節點
new_xml = et.Element('profile')
# 建立根節點的第一層子節點,引數依次表示父節點,子節點名稱,子節點屬性
name = et.SubElement(new_xml, 'name', attrib={'LuZhiShen': 'HuaHeShang'})
age = et.SubElement(name, 'age', attrib={'adult': 'yes'})
# 設定子節點的值
age.text = '22'
gender = et.SubElement(name, 'gender')
gender.text = 'man'
# 建立第二個根節點的第一層子節點
name2 = et.SubElement(new_xml, 'name', attrib={'WuYong': 'Zhiduoxing'})
age2 = et.SubElement(name2, 'age')
age2.text = '23'
# 生成新的xml文件
ET = et.ElementTree(new_xml)
# 儲存文件
ET.write('my.xml', encoding='utf-8', xml_declaration='true')
# 列印文件格式
et.dump(new_xml)
建立的xml文件格式:
可以看出與一般的xml檔案相比就差縮排了,不過不影響資料交換啦。
注意:
SubElement()方法用於建立新的節點,它的第一個引數決定了新節點屬於什麼節點的子節點。
相關文章
- [Python模組學習] glob模組Python
- Python學習——logging模組Python
- Python學習——shelve模組Python
- Python學習——configparser模組Python
- Python學習——hashlib模組Python
- Python學習之模組Python
- Python學習之常用模組Python
- 學習Python的urllib模組Python
- Python學習之 datetime模組Python
- python基礎學習16—-模組Python
- Python學習之模組與包Python
- Python的shutil zipfile tarfile模組學習Python
- Python學習之如何引用Python自定義模組?Python
- 模組學習之hashlib模組
- 模組學習之logging模組
- Python3學習筆記(5)常用模組:time、datetime、random、os、sys、shutil、shelve、xml處理Python筆記randomXML
- Python學習【第十四篇】shutil模組Python
- itertools 模組學習
- python開發學習之如何更好的引用Python模組?Python
- Python開發常用的庫及模組!Python學習教程Python
- Python學習筆記_函式_匯入模組Python筆記函式
- Python學習【第十二篇】time & datetime模組Python
- Python學習【第十三篇】隨機數相關:random模組&string模組Python隨機random
- Python3學習筆記4 , 迴圈、模組Python筆記
- retrying模組的學習
- Node fs模組學習
- Linux核心模組學習Linux
- nginx學習之模組Nginx
- python 模組:itsdangerous 模組Python
- Python模組:time模組Python
- Node 快速學習 crypto 模組
- 高通 QUP模組學習
- 深入學習 Linux 核心模組Linux
- Python模組之urllib模組Python
- python模組之collections模組Python
- Python案例學習——模組和包、爬蟲的基礎概念Python爬蟲
- Python 學習之元組Python
- 小豬的Python學習之旅 —— 7.Python併發之threading模組(1)Pythonthread