Python學習——xml模組

淺洛帆發表於2018-05-12

一、簡述

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

說明:

  1. getroot()用於返回根節點,tag返回節點名,attrib返回節點屬性,text返回節點的值;

  2. 只返回某個節點的資訊,使用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()方法用於建立新的節點,它的第一個引數決定了新節點屬於什麼節點的子節點。

參考:http://www.cnblogs.com/linupython/p/8308315.html

相關文章