🍖xml 模塊 (瞭解)

本文來自 :https://www.cnblogs.com/yang1333/articles/12609714.html#3177870913html

1. XML文檔模板

Copy<?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>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

2. 查看

Copy"""
# 注意: 返回值都是對應的標籤節點對象.
print(root.iter('year')) # 全文搜索
print(root.find('country')) # 在root的子節點找,只找一個
print(root.findall('country')) # 在root的子節點找,找全部(類始於subprocess中的找到全部sections)
"""
import xml.etree.ElementTree as ET  # 這樣導入的好處就是xml和etree包中的功能都能直接使用. 同時三者能夠結合使用

# 打開文件, 讀出xml文件對象
tree = ET.parse('db.xml')  # 如上xml模板存入db.xml文件中
print(tree)  # <xml.etree.ElementTree.ElementTree object at 0x0000023703B24070>

# 讀出頂級節點對象date
root = tree.getroot()
print(root)  # <Element 'data' at 0x0000023703C7E720>

# 查找三種方式
# 1. 全文搜索: root.iter('year') 
res = root.iter("year")
print(res)  # <_elementtree._element_iterator object at 0x0000023EE649DE50>

for year in res:
    print(''.center(50, '-'))
    print(year.tag)  # 獲取year節點對象的標籤名
    print(year.attrib)  # 獲取year節點對象的屬性. 以key:value對的形式輸出. key代指屬性名, value代指屬性值
    print(year.text)  # 獲取year節點對象中的文本內容.
"""
--------------------------------------------------
year
{'update': 'no'}
2018
--------------------------------------------------
year
{'update': 'no'}
2021
--------------------------------------------------
year
{'update': 'no'}
2021
"""

# 2. 在root的子節點找,只找一個: root.find('country')
res = root.find('country')
print(res.tag)  # country
print(res.attrib)  # {'name': 'Liechtenstein'}
print(res.text)  # 文本內容爲空

# 遞歸查找country下的year. 並獲取其標籤名, 屬性, 文本內容
res = root.find('country').find('year')  # 等同於接着上面的繼續, res.find('year')
print(res)  # <Element 'year' at 0x000002A64D5BD590>
print(res.tag)  # year
print(res.attrib)  # {'update': 'no'}
print(res.text)  # 2018

# 3. 在root的子節點找全部: root.findall("country")
res = root.findall("country")
print(res)  # [<Element 'country' at 0x00000253D3A9E770>, <Element 'country' at 0x00000253D3ACD810>, <Element 'country' at 0x00000253D3ACDAE0>]

for country in res:
    print(''.center(50, '-'))
    res = country.find('year')
    print(res.tag)
    print(res.attrib)
    print(res.text)
'''
--------------------------------------------------
year
{'update': 'no'}
2018
--------------------------------------------------
year
{'update': 'no'}
2021
--------------------------------------------------
year
{'update': 'no'}
2021
'''

3. 修改

Copy
import xml.etree.ElementTree as ET

tree = ET.parse('db.xml')
root = tree.getroot()

# 需求: 把"db.xml"文件中的country全部year標籤屬性名改成no, 標籤文本加10
for year in root.iter('year'):
    print(year)
    year.text = str(int(year.text) + 10)  # 注意: "db.xml"使用year.text讀出, 默認是字符串, 咱們要使用int轉換成整型才能進行數字運算.
    year.attrib = {'update': 'no'}

tree.write('db.xml')

# 需求:  把"db.xml"文件中的country下全部gdppc標籤文本加10000
for gdppc in root.iter('gdppc'):
    print(gdppc)
    gdppc.text = str(int(gdppc.text) + 10000)

tree.write('db.xml')

4. 增長

Copyimport xml.etree.ElementTree as ET

tree = ET.parse('db.xml')
root = tree.getroot()

for country in root.iter('country'):
    year = country.find("year")
    if int(year.text) > 2010:
        # 1. 調用ET.Element()方法增長標籤, 屬性, 文本
        flag = ET.Element('egon')  # 2. 添加標籤
        flag.attrib = {'DSB': 'yes'} #  3. 爲添加的flag標籤對象添加屬性
        flag.text = '大帥逼1'  # 4. 爲添加的flag標籤對象添加文本內容
        country.append(flag) # 5. 把添加的flag標籤對象追加到country標籤中, 做爲country的子節點標籤對象.(往country節點下添加子節點)

tree.write("db.xml")

5. 刪除

Copyimport xml.etree.ElementTree as ET

tree = ET.parse('db.xml')
root = tree.getroot()

# 需求: 在全部的country標籤節點對象下的rank若是它的文本內容大於50, 那麼就刪除這個country
for country in root.findall('country'):
   rank = int(country.find('rank').text)
   if rank > 50:
     root.remove(country)
 
tree.write('db.xml')

6. 新建XML文檔

Copyimport xml.etree.ElementTree as ET

new_xml = ET.Element("country")  # 建立標籤country節點, 返回new_xml節點對象
name = ET.SubElement(new_xml, "name", attrib={"update": "yes"})  # 在new_xml節點對象下建立標籤名爲"name"的子節點對象, 並指定屬性
name.text = 'egon'  # 爲"name"字節的點對象添加文本內容
age = ET.SubElement(new_xml, 'year', attrib={'update': 'no'})
age.text = '18'
sex = ET.SubElement(new_xml, 'sex')
sex.text = 'male'

et = ET.ElementTree(new_xml)  # 生成文檔對象
et.write('text.xml', encoding='utf-8', xml_declaration=True)  # 建立文件, 將該文檔對象"et"寫入.
相關文章
相關標籤/搜索