首頁 > 軟體

python操作XML格式檔案的一些常見方法

2022-07-18 22:05:13

前言

可延伸標示語言,是一種簡單的資料儲存語言,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檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com