1、python 操作xml的方式介绍

查看全部包含“三种⽅法:

  • ⼀是xml.dom. * 模块,它是W3CDOMAPI的实现,若需要处理DOMAPI则该模块很适合;
  •  ⼆是xml.sax. * 模块,它是SAXAPI的实现,这个模块牺牲了便捷性来换取速度和内存占⽤,SAX是⼀个基于事件的API,这就意味着它可以“在空中”处理庞⼤数量的的⽂档,不⽤完全加载进内存;
  • 三是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,⽽且有很多令⼈愉悦的API可以使⽤,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理⽅式,没有必要加载整个⽂档到内存,ET的性能的平均值和SAX差不多,但是API的效率更⾼⼀点⽽且使⽤起来很⽅便。”的文档

2、ElementTree模块

解析xml文件并获取根节点:

from xml.etree import ElementTree as ET

# 1、打开xml文件
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 获xml文件的内容取根标签
root = tree.getroot()
print(root)

3、解析xml格式字符串并获取根节点

注意xml格式的内容应该没有xml格式声明的内容“<?xml version="1.0" encoding="UTF-8"?>”,

如果有则会解析错误:

content = """
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="关联关系XML Schema-3.0.xsd" License="">
  <Events version="3.0">
    <Event name="RelationCreate">
      <Relation productCode="06970593810109" subTypeNo="06970593810109" cascade="1" packageSpec="50人份/盒" comment="" linkProductCode="" assCorpCode="">
		<Batch batchNo="N0530001" madeDate="2022-05-30" validateDate="2023-05-29" workshop="无" lineName="无" lineManager="无">
			<Code curCode="010697059381010910N053000117230527" packLayer="1" parentCode="" flag="0" />
		 </Batch>
      </Relation>
    </Event>
  </Events>
</Document>
"""
root2= ET.XML(content)
print(root2)

4、读取节点内容,getroot()

获取标签名,获取标签属性及获取标签文本:

# 1、打开xml文件
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 获xml文件的内容取根标签
root = tree.getroot()
# 2、读取节点内容
# 2.1 获取根标签下的子标签
for child in root: 获取根节点下的子标签
    print(child.tag)      #  *.tag 是获取标签名字(字符串类型)
    print( child.attrib)  #  *.attrib是获取标签属性(字典类型)
    for node in child:   获取跟标签下子标签的子标签
        print(node.tag)
        print(node.attrib)
        print(node.text)   # *.text 获取标签文本

5、通标标签名直接获取标签(find,findall)

find() # 此种写法只能获取根标签下的一级子标签,即只能查询下一级标签,不能查询到下一级的下一级标签,且找到的是第一个相应的标签
findall()此种写法只能获取根标签下的一级子标签,即只能查询下一级标签,不能查询到下一级的下一级标签 ,但是找到下一级的所有符合名称的标签

# 1、打开xml文件
from xml.etree import ElementTree as ET
# 1、打开xml文件
from xml.etree import ElementTree as ET
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 获xml文件的内容取根标签
root = tree.getroot()
print(root)
# 2.2 通过标签名称获取标签 find()
events_object = root.find("Events")  # 此种写法只能获取根标签下的一级子标签,即只能查询下一级标签,不能查询到下一级的下一级标签,**且找到的是第一个响应的标签**
print(events_object.tag, events_object.attrib)

event_object = events_object.find("Event")   # 进一步获取跟标签下子标签的子标签
print(event_object.tag,event_object.attrib)

# 2.3 通过标签名称获取标签 findall()
events_objects = root.findall("Events")  # 此种写法只能获取根标签下的一级子标签,即只能查询下一级标签,不能查询到下一级的下一级标签,但是可以获取下一级所有符合名称的标签
for event_clee in events_objects:
    print(event_clee.tag, event_clee.attrib)
    event_object = event_clee.findall("Event")   # 进一步获取跟标签下子标签的子标签
    for relation_cell in event_object:
        print(relation_cell.tag, relation_cell.attrib)

# 2.4 findall(xpath)
Events_object = root.findall('.//Code')
Events_object1 = root.findall('.//Code[@curCode="010697059381010910N053000117230527"]')
Events_object2 = root.findall('.//*[@curCode="010697059381010910N053000117230527"]')
#注意 前面的“.”不能省略,
print(Events_object)
print(Events_object1)
print(Events_object2[0])

6、全文搜索标签名(类似xpath路径查找标签)

from xml.etree import ElementTree as ET

# 1、打开xml文件
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 获xml文件的内容取根标签
root = tree.getroot()
print(root)
# 2.2 根据标签名全文搜索标签
Code_object = root.iter("Code")   全文搜索标签名为“Code”的标签
print(Code_object)
for code in Code_object:
    print(code.tag, code.attrib)

7、修改节点

from xml.etree import ElementTree as ET
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 获xml文件的内容取根标签
root = tree.getroot()

relation_object = root.find("Events").find("Event").iter("Relation") # 获取第一个Events的一级子标签下的Relation子标签
for relation_cell in relation_object:
    relation_cell.set("productCode", "产品编码")    #  如果有相应属性,则修改属性值,没有则新增
    relation_cell.set("productCode2", "产品编码2")
    relation_cell.find("Batch").find("Code").text="追溯码"  # 注意:如果之前是短标签,增加文本属性后自动变为长标签。
tree = ET.ElementTree(root)
tree.write("new.xml", encoding="utf-8",short_empty_elements=True)    # 如果文件不存在,则创建文件,如果文件已存在则修改响应内容

8、删除节点

from xml.etree import ElementTree as ET
tree =ET.parse(r"E:\Acctrue2.0Test\testData\N0530YPYM001.xml")
# 获xml文件的内容取根标签
root = tree.getroot()
# ####################错误的删除方式########################
# # 获取响应标签
# Event_object = root.find("Events").find("Event")
# # 删除相应标签
# root.remove(Event_object)   # 删除只能删除其子标签,不能删除其子标签下的子标签,因为relation_object是子标签下的子标签,因此此时删除失败

################## 正确的删除方式#############################
Events_object = root.find("Events")
Event_object = Events_object.find("Event")
Events_object.remove(Event_object)
tree = ET.ElementTree(root)
tree.write("new.xml", encoding="utf-8")    # 如果文件不存在,则创建文件,如果文件已存在则修改响应内容

9、构建文件

方式1 (Element)

先创建各类标签,再建立标签之间关系:

from xml.etree import ElementTree as ET
# 创建根标签
root = ET.Element("root")
# 创建一个标签tagName1
tagName1 = ET.Element("tagName1", {"tag1Attribute":"AttributeValue1"})
# 创建一个标签tagName2
tagName2 = ET.Element("tagName2", {"tag2Attribute":"AttributeValue2"})
# 创建一个标签tagName11
tagName11 = ET.Element("tagName11", {"tag11Attribute":"AttributeValue11"})
# 创建一个标签tagName12
tagName12 = ET.Element("tagName12", {"tag12Attribute":"AttributeValue12"})
# 将标签tagName11和tagName12 添加的tagName1中作为tagName1的子标签
tagName1.append(tagName11)
tagName1.append(tagName12)
# 将标签tagName1和tagName2 添加的root中作为root的子标签
root.append(tagName1)
root.append(tagName2)
# 保存
tree = ET.ElementTree(root)
tree.write("newCreate.xml", xml_declaration=True,  encoding="utf-8",short_empty_elements=True)
# xml_declaration是否包含声明文件, encoding编码方式,short_empty_elements 规定是短标签(单标签)还是双标签
<?xml version='1.0' encoding='utf-8'?>
<root>
    <tagName1 tag1Attribute="AttributeValue1">
        <tagName11 tag11Attribute="AttributeValue11"/>
        <tagName12 tag12Attribute="AttributeValue12"/>
    </tagName1>
    <tagName2 tag2Attribute="AttributeValue2"/>
</root>

方式2 (makeelement)

from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("family")

# 创建一级子标签
son1 = root.makeelement("son", {"name":"son1"})
son2 = root.makeelement("son", {"name":"son2"})

# 创建二级子标签
grandson1 = son1.makeelement("grandson1", {"name":"grandson1"})
grandson2 = son1.makeelement("grandson1", {"name":"grandson2"})

# 将二级子标签与一级子标签关联
son1.append(grandson1)
son1.append(grandson2)
# 将一级子标签与根标签关联
root.append(son2)
root.append(son1)
tree = ET.ElementTree(root)
tree.write("../testData/neswfile.xml", xml_declaration=True, encoding="utf-8")

方式3

此种方式是在创建元素时直接建立相关关系:

from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("family")
# 创建一级子标签
son1 = ET.SubElement(root, "son", {"name":"son1"})
son2 = ET.SubElement(root,"son", {"name":"son2"})

# 创建二级子标签
grandson1 = ET.SubElement(son1,"grandson1", {"name":"grandson1"})
grandson1.text="大孙子"
grandson2 = ET.SubElement(son1,"grandson1", {"name":"grandson2"})
grandson2.text="小孙子"
tree = ET.ElementTree(root)
tree.write("../testData/neswfile.xml", xml_declaration=True, encoding="utf-8")
<?xml version='1.0' encoding='utf-8'?>
<family>
    <son name="son1">
        <grandson1 name="grandson1">大孙子</grandson1>
        <grandson1 name="grandson2">小孙子</grandson1>
    </son>
    <son name="son2"/>
</family>

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

python处理xml文件操作详解的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  3. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  4. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  7. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  8. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  9. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

  10. 在android studio中使用python代码构建android应用程序

    我有一些python代码和它的机器人,我正在寻找一种方法来使用android项目中的那些python代码.有没有办法做到这一点!?解决方法有两种主要工具可供使用,它们彼此不同:>QPython>Kivy使用Kivy,大致相同的代码也可以部署到IOS.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部