<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
python中xml格式的轉換,供大家參考,具體內容如下
近期在做專案的時候需要將資料進行xml和dict 的轉換,這裡進行初步的總結
1. 基於DOM.
寫入
# 匯入 import xml.dom.minidom as minidom # 建立檔案範例 dom = minidom.getDOMImplementation().createDocument(None,'Root',None) # 獲得根節點 root = dom.documentElement for i in range(5): # 建立節點 element = dom.createElement('Name') # 給這個節點新增資料 element.appendChild(dom.createTextNode('default')) # 設定屬性 element.setAttribute('age', str(i)) # 新增到節點 root.appendChild(element) # 儲存檔案 相對與原始的寫入回自動縮排 with open('own.xml', 'w', encoding='utf-8') as f: dom.writexml(f, addindent='t', newl='n',encoding='utf-8') # 檔案內容 <?xml version="1.0" encoding="utf-8"?> <Root> <Name age="0">default</Name> <Name age="1">default</Name> <Name age="2">default</Name> <Name age="3">default</Name> <Name age="4">default</Name> </Root> # ================================== 如果需要將已經寫好的xml檔案進行縮排處理 可以執行以下程式碼 root 是獲取的根節點 import xml.etree.ElementTree as ET from xml.dom import minidom def save_xml(root, filename, indent="t", newl="n", encoding="utf-8"): raw_text = ET.tostring(root) dom = minidom.parseString(raw_Text) with open(filename, "w") as f: dom.writexml(f, indent, newl, encoding)
讀取
import xml.etree.ElementTree as ET from xml.dom import minidom # 讀取檔案 dom = minidom.parse("own.xml") # 獲取根節點 root = dom.documentElement # 按照名稱查詢位元組點, 注意這裡 回遞迴查詢所有子節點 所有的子節點: root.childNodes names = root.getElementsByTagName("Name") for name in names: print(name.childNodes[0].nodeValue, end="t") # 查詢name是否含有屬性age if name.hasAttribute("age"): # 產看屬性age print(name.getAttribute("age"), end="t") print("")
2. 基於ElementTree
寫入
# 匯入 # -*- coding:utf-8 -*- import xml.etree.ElementTree as ET # 增加換行符 def __indent(elem, level=0): i = "n" + level*"t" if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + "t" if not elem.tail or not elem.tail.strip(): elem.tail = i for elem in elem: __indent(elem, level+1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i root = ET.Element('Root') # 建立節點 tree = ET.ElementTree(root) # 建立檔案 for i in range(5): element = ET.Element('Name') element.set('age', str(i)) element.text = 'default' root.append(element) __indent(root) # 增加換行符 tree.write('default.xml', encoding='utf-8', xml_declaration=True) # 檔案內容 <?xml version='1.0' encoding='utf-8'?> <Root> <Name age="0">default</Name> <Name age="1">default</Name> <Name age="2">default</Name> <Name age="3">default</Name> <Name age="4">default</Name> </Root>
讀取
# -*- coding:utf-8 -*- import xml.etree.ElementTree as ET # 獲取檔案 tree = ET.parse('default.xml') # 獲取根節點 root = tree.getroot() # 獲取所有子節點 list(root) # 查詢所有子節點(非遞迴) root.findall("Name") 遞迴 root.iter("Name") for node in list(root): print(node.text, node.tag, node.get('age')) for node in root.findall('Name'): print(node.text, node.tag, node.get('age')) # 輸出 default Name 0 default Name 1 default Name 2 default Name 3 default Name 4 default Name 0 default Name 1 default Name 2 default Name 3 default Name 4
1、解析xml檔案:
使用iterfind尋找節點,獲取子節點方法 list(節點),獲取節點屬性 get(屬性名),下一級節點的值findtext
from xml.etree.ElementTree import parse try: doc=parse('b.xml') for item in doc.iterfind('class'): classname=item.get('a_name') print("classname=",classname) for s in list(item): name=s.findtext('name') age = s.findtext('age') sex = s.findtext('sex') print("name=",name,"age=",age,"sex=",sex) print("-------------------") except Exception as e: print(e)
2、字典轉換為xml檔案:
使用dicttoxml模組,方法:dicttoxml.dicttoxml(字典資料,根節點名稱 custom_root=”)import dicttoxml
from xml.dom.minidom import parseString import os d=[20,'name', {'name':'apple','num':10,'price':23}, {'name': 'pear', 'num': 20, 'price': 18.7}, {'name': 'banana', 'num': 10.5, 'price': 23}] bxml=dicttoxml.dicttoxml(d,custom_root='fruit') xml=bxml.decode('utf-8') print(xml) dom=parseString(xml) pxml=dom.toprettyxml(indent=' ') f=open('fruits.xml','w',encoding='utf-8') f.write(pxml) f.close()
3、xml檔案轉為字典:
使用xmltodict模組 ,方法:xmltodict.parse(xml字串)
import xmltodict import pprint f=open('fruits.xml') xml=f.read() d=xmltodict.parse(xml) pp=pprint.PrettyPrinter(indent=4) pp.pprint(d)#可以通過d['root']['arg']['#text']來存取節點中的文字值,d['root']['arg']['@p']來存取屬性值 f.close()
4、字典轉換為json
使用json的dumps方法
import json data={'name':'bill','company':'huawei','age':30} jsonstr=json.dumps(data) print(jsonstr)
5、json轉換為字典:
使用json模組的loads函數,傳入json字串,返回該字串對應的字典
d=json.loads(jsonstr) print(d)
6、json轉換為類範例
1)、在指定的類中必須有一個接受字典的建構函式;或指定回撥函數json2Product;
2)、使用json的loads方法(json字串,object_hook=類名或者回撥函數名)
import json class Product: def __init__(self,d): self.__dict__=d def json2Product(d): return Product(d) f=open('products.json','r',encoding='utf-8') strjson=f.read() products=json.loads(strjson,object_hook=Product) for p in products: print('name=',p.name,'price=',p.price)
7、 類範例轉換為json:
1)、指定回撥函數(product2Dict)
2)、使用json的dump函數,指定default引數的回撥函數import json
def product2Dict(product): return { 'name': product.name, 'price': product.price, 'count': product.count } strJson=json.dumps(products,default=product2Dict) print(strJson)
8、字典轉換為類:
1)、將字典轉換為json
2)、json轉換為類
import json data=[{"name": "iPhone9", "price": 9999, "count": 3000}, {"name": "tesila", "price": 800000, "count": 122}] # 將字典轉換為json jsonstr=json.dumps(data) class Product: def __init__(self,d): self.__dict__=d def json2Product(d): return Product(d) # 將json轉換為類 ps=json.loads(jsonstr,object_hook=Product) for p in ps: print('name=', p.name, 'price=', p.price)
9、將類轉換為字典:
1)、類轉換為json,使用json的dumps方法
2)、json轉為字典,使用json的loads方法
def product2Dict(product): return { 'name': product.name, 'price': product.price, 'count': product.count } # 將類轉換為json strJson=json.dumps(ps,default=product2Dict) print(strJson) d=json.loads(strJson) print(d)
10、json轉xml
1)、先將xml轉換為字典
2)、再使用dicttoxml轉換為字典
import json import dicttoxml f=open('products.json','r',encoding='utf-8') jsonstr=f.read() # 將json轉換為字典 d=json.loads(jsonstr) print(d) # 將字典轉換為xml bxml=dicttoxml.dicttoxml(d,custom_root='fruit') print(bxml)
11、將xml轉換為json
1)、先使用xmltodict轉換為字典
2)、再將字典轉換為json
import xmltodict import json f=open('products.xml','r',encoding='utf-8') d=f.read() #先將xml轉換為字典 data=xmltodict.parse(d) print(data) #再將字典轉換為json strjson=json.dumps(data) print(strjson)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45