python操作XML格式文件的一些常見方法

前言

可擴展標記語言,是一種簡單的數據存儲語言,XML被設計用來傳輸和存儲數據

  • 存儲,可用來存放配置文件,例:java配置文件
  • 傳輸,網絡傳輸以這種格式存在,例:早期ajax傳輸數據等
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2023</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2026</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2026</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>

1. 讀取文件和內容

#導包
from xml.etree import ElementTree as ET

# ET去打開xml文件
tree = ET.parse("files/xo.xml")
# 獲取根標簽
root = tree.getroot()
print(root) # <Element 'data' at 0x7f94e02763b0>

2.讀取節點數據

獲取根標簽

root = ET.XML(content)

查找節點【默認找第一個】 find()

country_object = root.find("country")
print(country_object)  #<Element 'country' at 0x0000020D57DFB220>

獲取節點標簽 tag

country_object.tag  #country

獲取節點屬性 attrib

country_object.attrib   #{'name': 'Liechtenstein'}

獲取節點文本 text

gdppc_object.text    #141100

循環節點

# 獲取data標簽的孩子標簽
for child in root:
    print(child.tag, child.attrib)
    #獲取child標簽的孩子標簽
    for node in child:
        print(node.tag, node.attrib, node.text)

查找所有標簽 iter()

# 獲取data裡面所有year標簽
for child in root.iter('year'):
    print(child.tag, child.text)

查找所有標簽 findall()

# 查找所有的country標簽
v1 = root.findall('country')

查找標簽

# 查找country裡面的rank標簽,找第一個
v2 = root.find('country').find('rank')

3.修改和刪除節點

【修改和刪除內容隻在內存中修改,沒有存到文件中,都要重新保存文件】

修改節點內容

#修改rank文本
rank.text = "999"
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

修改節點屬性

#修改rank屬性
rank.set('update', '2020-11-11')
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

保存文件

tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

刪除節點

root.remove( root.find('country') )
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')

4.構建文檔 方式一ET.Element()

<home>
    <son name="兒1">
        <grandson name="兒11"></grandson>
        <grandson name="兒12"></grandson>
    </son>
    <son name="兒2"></son>
</home>
from xml.etree import ElementTree as ET
#創建根標簽
root=ET.Element('home')
# 創建大兒子,與root還沒有關系
son1=ET.Element('son',{'name':'兒1'})
#創建小兒子,與root還沒有關系
son2=ET.Element('son',{'name':'兒2'})

#創建2個孫子
grandson1=ET.Element('grandson',{'name':'兒11'})
grandson2=ET.Element('grandson',{'name':'兒12'})

# 創建兩個孫子,與son1還沒有關系
son1.append(grandson1)
son1.append(grandson2)

# 把兒子添加到根節點
root.append(son1)
root.append(son2)

#root節點放到根節點中
tree=ET.ElementTree(root)
#保存xml文件
# short_empty_elements=True,節點中沒有元素,用簡寫方式顯示例:<grandson name="兒11" />
tree.write('file/root.xml',encoding='utf-8',short_empty_elements=True)

方式二 標簽.makeelement()

<famliy>
    <son name="兒1">
        <grandson name="兒11"></grandson>
        <grandson name="兒12"></grandson>
    </son>
    <son name="兒2"></son>
</famliy>
from xml.etree import ElementTree as ET

# 創建根節點
root = ET.Element("famliy")

# 創建大兒子,與root還沒有關系
son1 = root.makeelement('son', {'name': '兒1'})

#創建小兒子,與root還沒有關系
son2 = root.makeelement('son', {"name": '兒2'})

# 創建兩個孫子,與son1還沒有關系
grandson1 = son1.makeelement('grandson', {'name': '兒11'})
grandson2 = son1.makeelement('grandson', {'name': '兒12'})

son1.append(grandson1)
son1.append(grandson2)

# 把兒子添加到根節點中
root.append(son1)
root.append(son2)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8')

方式三 標簽.SubElement(),創建標簽的子標簽

<famliy>
	<son name="兒1">
    	<age name="兒11">孫子</age>
    </son>
	<son name="兒2"></son>
</famliy>
from xml.etree import ElementTree as ET

# 創建根節點
root = ET.Element("famliy")

# 創建root節點的子標簽大兒子
son1 = ET.SubElement(root, "son", attrib={'name': '兒1'})
# 創建root節點的子標簽小兒子
son2 = ET.SubElement(root, "son", attrib={"name": "兒2"})

# 在大兒子中創建一個孫子
grandson1 = ET.SubElement(son1, "age", attrib={'name': '兒11'})
grandson1.text = '孫子'


et = ET.ElementTree(root)  #生成文檔對象
et.write("test.xml", encoding="utf-8")

方式四

<user><![CDATA[你好呀]]</user>
from xml.etree import ElementTree as ET

# 創建根節點
root = ET.Element("user")
#<![CDATA[你好呀]]直接添加到文本裡
root.text = "<![CDATA[你好呀]]"

et = ET.ElementTree(root)  # 生成文檔對象
et.write("test.xml", encoding="utf-8")

補充:XML文件和JSON文件互轉

記錄工作中常用的一個小技巧

cmd控制臺安裝第三方模塊:

pip install xmltodict

1、XML文件轉為JSON文件

新建一個1.xml文件:

<note date="23/04/2022">
    <to>tom</to>
    <from>mary</from>
    <msg>love</msg></note>

轉換代碼實現:

import jsonimport xmltodictdef xml_to_json(xml_str):
    """parse是的xml解析器,參數需要
    :param xml_str: xml字符串
    :return: json字符串
    """
    xml_parse = xmltodict.parse(xml_str)
    # json庫dumps()是將dict轉化成json格式,loads()是將json轉化成dict格式。
    # dumps()方法的ident=1,格式化json
    json_str = json.dumps(xml_parse, indent=1)
    return json_str
 
 
XML_PATH = './1.xml'  # xml文件的路徑with open(XML_PATH, 'r') as f:
    xmlfile = f.read()
    with open(XML_PATH[:-3] + 'json', 'w') as newfile:
        newfile.write(xml_to_json(xmlfile))

輸出結果(生成json文件):

2、JSON文件轉換為XML文件

新建test.json文件:

{
  "student": {
    "course": {
      "name": "math",
      "score": "90"
    },
    "info": {
      "sex": "male",
      "name": "name"
    },
    "stid": "10213"
  }}

轉換代碼實現:

import xmltodictimport jsondef json_to_xml(python_dict):
    """xmltodict庫的unparse()json轉xml
    :param python_dict: python的字典對象
    :return: xml字符串
    """
    xml_str = xmltodict.unparse(python_dict)
    return xml_str
 
 
JSON_PATH = './test.json'  # json文件的路徑with open(JSON_PATH, 'r') as f:
    jsonfile = f.read()
    python_dict = json.loads(jsonfile)  # 將json字符串轉換為python字典對象
    with open(JSON_PATH[:-4] + 'xml', 'w') as newfile:
        newfile.write(json_to_xml(python_dict))

輸出結果(生成xml文件):

總結

到此這篇關於python操作XML格式文件的文章就介紹到這瞭,更多相關python操作XML文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: