经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python操作XML格式文件的一些常见方法
来源:jb51  时间:2022/7/19 9:55:55  对本文有异议

前言

可扩展标记语言,是一种简单的数据存储语言,XML被设计用来传输和存储数据

  • 存储,可用来存放配置文件,例:java配置文件
  • 传输,网络传输以这种格式存在,例:早期ajax传输数据等
  1. <data>
  2. <country name="Liechtenstein">
  3. <rank updated="yes">2</rank>
  4. <year>2023</year>
  5. <gdppc>141100</gdppc>
  6. <neighbor direction="E" name="Austria" />
  7. <neighbor direction="W" name="Switzerland" />
  8. </country>
  9. <country name="Singapore">
  10. <rank updated="yes">5</rank>
  11. <year>2026</year>
  12. <gdppc>59900</gdppc>
  13. <neighbor direction="N" name="Malaysia" />
  14. </country>
  15. <country name="Panama">
  16. <rank updated="yes">69</rank>
  17. <year>2026</year>
  18. <gdppc>13600</gdppc>
  19. <neighbor direction="W" name="Costa Rica" />
  20. <neighbor direction="E" name="Colombia" />
  21. </country>
  22. </data>

1. 读取文件和内容

  1. #导包
  2. from xml.etree import ElementTree as ET
  3.  
  4. # ET去打开xml文件
  5. tree = ET.parse("files/xo.xml")
  6. # 获取根标签
  7. root = tree.getroot()
  8. print(root) # <Element 'data' at 0x7f94e02763b0>

2.读取节点数据

获取根标签

  1. root = ET.XML(content)

查找节点【默认找第一个】 find()

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

获取节点标签 tag

  1. country_object.tag #country

获取节点属性 attrib

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

获取节点文本 text

  1. gdppc_object.text #141100

循环节点

  1. # 获取data标签的孩子标签
  2. for child in root:
  3. print(child.tag, child.attrib)
  4. #获取child标签的孩子标签
  5. for node in child:
  6. print(node.tag, node.attrib, node.text)

查找所有标签 iter()

  1. # 获取data里面所有year标签
  2. for child in root.iter('year'):
  3. print(child.tag, child.text)

查找所有标签 findall()

  1. # 查找所有的country标签
  2. v1 = root.findall('country')

查找标签

  1. # 查找country里面的rank标签,找第一个
  2. v2 = root.find('country').find('rank')

3.修改和删除节点

【修改和删除内容只在内存中修改,没有存到文件中,都要重新保存文件】

修改节点内容

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

修改节点属性

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

保存文件

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

删除节点

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

4.构建文档 方式一ET.Element()

  1. <home>
  2. <son name="儿1">
  3. <grandson name="儿11"></grandson>
  4. <grandson name="儿12"></grandson>
  5. </son>
  6. <son name="儿2"></son>
  7. </home>
  1. from xml.etree import ElementTree as ET
  2. #创建根标签
  3. root=ET.Element('home')
  4. # 创建大儿子,与root还没有关系
  5. son1=ET.Element('son',{'name':'儿1'})
  6. #创建小儿子,与root还没有关系
  7. son2=ET.Element('son',{'name':'儿2'})
  8.  
  9. #创建2个孙子
  10. grandson1=ET.Element('grandson',{'name':'儿11'})
  11. grandson2=ET.Element('grandson',{'name':'儿12'})
  12.  
  13. # 创建两个孙子,与son1还没有关系
  14. son1.append(grandson1)
  15. son1.append(grandson2)
  16.  
  17. # 把儿子添加到根节点
  18. root.append(son1)
  19. root.append(son2)
  20.  
  21. #root节点放到根节点中
  22. tree=ET.ElementTree(root)
  23. #保存xml文件
  24. # short_empty_elements=True,节点中没有元素,用简写方式显示例:<grandson name="儿11" />
  25. tree.write('file/root.xml',encoding='utf-8',short_empty_elements=True)

方式二 标签.makeelement()

  1. <famliy>
  2. <son name="儿1">
  3. <grandson name="儿11"></grandson>
  4. <grandson name="儿12"></grandson>
  5. </son>
  6. <son name="儿2"></son>
  7. </famliy>
  1. from xml.etree import ElementTree as ET
  2.  
  3. # 创建根节点
  4. root = ET.Element("famliy")
  5.  
  6. # 创建大儿子,与root还没有关系
  7. son1 = root.makeelement('son', {'name': '儿1'})
  8.  
  9. #创建小儿子,与root还没有关系
  10. son2 = root.makeelement('son', {"name": '儿2'})
  11.  
  12. # 创建两个孙子,与son1还没有关系
  13. grandson1 = son1.makeelement('grandson', {'name': '儿11'})
  14. grandson2 = son1.makeelement('grandson', {'name': '儿12'})
  15.  
  16. son1.append(grandson1)
  17. son1.append(grandson2)
  18.  
  19. # 把儿子添加到根节点中
  20. root.append(son1)
  21. root.append(son2)
  22.  
  23. tree = ET.ElementTree(root)
  24. tree.write('oooo.xml',encoding='utf-8')

方式三 标签.SubElement(),创建标签的子标签

  1. <famliy>
  2. <son name="儿1">
  3. <age name="儿11">孙子</age>
  4. </son>
  5. <son name="儿2"></son>
  6. </famliy>
  1. from xml.etree import ElementTree as ET
  2.  
  3. # 创建根节点
  4. root = ET.Element("famliy")
  5.  
  6. # 创建root节点的子标签大儿子
  7. son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
  8. # 创建root节点的子标签小儿子
  9. son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})
  10.  
  11. # 在大儿子中创建一个孙子
  12. grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
  13. grandson1.text = '孙子'
  14.  
  15.  
  16. et = ET.ElementTree(root) #生成文档对象
  17. et.write("test.xml", encoding="utf-8")

方式四

  1. <user><![CDATA[你好呀]]</user>
  1. from xml.etree import ElementTree as ET
  2.  
  3. # 创建根节点
  4. root = ET.Element("user")
  5. #<![CDATA[你好呀]]直接添加到文本里
  6. root.text = "<![CDATA[你好呀]]"
  7.  
  8. et = ET.ElementTree(root) # 生成文档对象
  9. et.write("test.xml", encoding="utf-8")

补充:XML文件和JSON文件互转

记录工作中常用的一个小技巧

cmd控制台安装第三方模块:

  1. pip install xmltodict

1、XML文件转为JSON文件

新建一个1.xml文件:

  1. <note date="23/04/2022">
  2. <to>tom</to>
  3. <from>mary</from>
  4. <msg>love</msg></note>

转换代码实现:

  1. import jsonimport xmltodictdef xml_to_json(xml_str):
  2. """parse是的xml解析器,参数需要
  3. :param xml_str: xml字符串
  4. :return: json字符串
  5. """
  6. xml_parse = xmltodict.parse(xml_str)
  7. # json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。
  8. # dumps()方法的ident=1,格式化json
  9. json_str = json.dumps(xml_parse, indent=1)
  10. return json_str
  11. XML_PATH = './1.xml' # xml文件的路径with open(XML_PATH, 'r') as f:
  12. xmlfile = f.read()
  13. with open(XML_PATH[:-3] + 'json', 'w') as newfile:
  14. newfile.write(xml_to_json(xmlfile))

输出结果(生成json文件):

2、JSON文件转换为XML文件

新建test.json文件:

  1. {
  2. "student": {
  3. "course": {
  4. "name": "math",
  5. "score": "90"
  6. },
  7. "info": {
  8. "sex": "male",
  9. "name": "name"
  10. },
  11. "stid": "10213"
  12. }}

转换代码实现:

  1. import xmltodictimport jsondef json_to_xml(python_dict):
  2. """xmltodict库的unparse()json转xml
  3. :param python_dict: python的字典对象
  4. :return: xml字符串
  5. """
  6. xml_str = xmltodict.unparse(python_dict)
  7. return xml_str
  8. JSON_PATH = './test.json' # json文件的路径with open(JSON_PATH, 'r') as f:
  9. jsonfile = f.read()
  10. python_dict = json.loads(jsonfile) # 将json字符串转换为python字典对象
  11. with open(JSON_PATH[:-4] + 'xml', 'w') as newfile:
  12. newfile.write(json_to_xml(python_dict))

输出结果(生成xml文件):

总结

到此这篇关于python操作XML格式文件的文章就介绍到这了,更多相关python操作XML文件内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号