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")
# 文档内容
default
default
default
default
default
# ==================================
如果需要将已经写好的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)
# 文档内容
default
default
default
default
default
读取
# -*- 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使用dicttoxml xmltodict等模块
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)以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
X 关闭
X 关闭
- 1现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 2如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 3AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 4转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 5充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 6好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 7名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 8亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 9京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 10网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久

