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!
推薦閱讀:
- python xml模塊的簡單使用
- python讀寫xml文件實例詳解嘛
- python標準庫ElementTree處理xml
- python通過ElementTree操作XML
- Python批量將csv文件轉化成xml文件的實例