python处理xml文件操作详解

目录
  • 1、python 操作xml的方式介绍
  • 2、ElementTree模块
  • 3、解析xml格式字符串并获取根节点
  • 4、读取节点内容,getroot()
  • 5、通标标签名直接获取标签(find,findall)
  • 6、全文搜索标签名(类似xpath路径查找标签)
  • 7、修改节点
  • 8、删除节点
  • 9、构建文件
    • 方式1 (Element)
    • 方式2 (makeelement)
    • 方式3

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python标准库ElementTree处理xml

    目录 1. 示例用法 Element对象具有如下属性和操作 遇到非法格式的xml ExpatError: no element found ExpatError: mismatched tag ExpatError: not well-formed(invalid token) 1. 示例用法 参照官方文档,创建country_data.xml测试文档,内容如下: <?xml version="1.0"?> <data> <country name=&qu

  • Python在字符串中处理html和xml的方法

    问题 你想将HTML或者XML实体如 &entity; 或 &#code; 替换为对应的文本. 再者,你需要转换文本中特定的字符(比如<, >, 或 &). 解决方案 如果你想替换文本字符串中的 '<' 或者 '>' ,使用 html.escape() 函数可以很容易的完成.比如: >>> s = 'Elements are written as "<tag>text</tag>".' >&

  • 浅谈Python大神都是这样处理XML文件的

    最近有同学询问如何利用Python处理xml文件,特此整理一个比较简洁的操作手册,供大家参阅. 首先准备一个xml文件,xml中的内容如下所示.存储为:student.xml 如果要获取这个xml里面的数据,我们需要利用Python里面ElementTree来进行处理. 具体操作如下所示: 1.导入包(包是Python内置自带) 2.打开文件,并获取根节点的属性和节点名称 运行代码后,结果如下所示: 3.利用find方法获取子节点(缺点:只能根据提供的名称获取第一个子节点) 运行结果如下所示:

  • Python利用ElementTree模块处理XML的方法详解

    前言 最近因为工作的需要,在使用 Python 来发送 SOAP 请求以测试 Web Service 的性能,由于 SOAP 是基于 XML 的,故免不了需要使用 python 来处理 XML 数据.在对比了几种方案后,最后选定使用 xml.etree.ElementTree 模块来实现. 这篇文章记录了使用 xml.etree.ElementTree 模块常用的几个操作,也算是总结一下,免得以后忘记了.分享出来也方法需要的朋友们参考学习,下面话不多说了,来一起看看详细的介绍吧. 概述 对比其他

  • python处理xml文件的方法小结

    本文实例讲述了python处理xml文件的方法.分享给大家供大家参考,具体如下: 前一段时间因为工作的需要,学习了一点用Python处理xml文件的方法,现在贴出来,供大家参考. xml文件是按节点一层一层来叠加的,最顶层的是根节点.比如说: <sys:String x:Key="STR_License_WithoutLicense">Sorry, you are not authorized.</sys:String> 其中sys:String为节点名字,x:

  • 在Python中处理XML的教程

    XML虽然比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML. DOM vs SAX 操作XML有两种方法:DOM和SAX.DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点.SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件. 正常情况下,优先考虑SAX,因为DOM实在太占内存. 在Python中使用SAX解析XML非常简洁,通常我们关心的事件是start_element,end_e

  • 实例Python处理XML文件的方法

    需求 有一个表,里面数据量比较大,每天一更新,其字段可以通过xml配置文件进行配置,即,可能每次建表的字段不一样. 上游跑时会根据配置从源文件中提取,到入库这一步需要根据配置进行建表. 解决 写了一个简单的xml,配置需要字段及类型 上游读取到对应的数据 入库这一步,先把原表删除,根据配置建新表 XML文件 <?xml version="1.0" encoding="UTF-8"?> <!-- 表名 ,数据库名 可灵活配置插入哪个库哪个表 --&g

  • Python处理XML格式数据的方法详解

    本文实例讲述了Python处理XML格式数据的方法.分享给大家供大家参考,具体如下: 这里的操作是基于Python3平台. 在使用Python处理XML的问题上,首先遇到的是编码问题. Python并不支持gb2312,所以面对encoding="gb2312"的XML文件会出现错误.Python读取的文件本身的编码也可能导致抛出异常,这种情况下打开文件的时候就需要指定编码.此外就是XML中节点所包含的中文. 我这里呢,处理就比较简单了,只需要修改XML的encoding头部. #!/

  • python处理xml文件操作详解

    目录 1.python 操作xml的方式介绍 2.ElementTree模块 3.解析xml格式字符串并获取根节点 4.读取节点内容,getroot() 5.通标标签名直接获取标签(find,findall) 6.全文搜索标签名(类似xpath路径查找标签) 7.修改节点 8.删除节点 9.构建文件 方式1 (Element) 方式2 (makeelement) 方式3 1.python 操作xml的方式介绍 查看全部包含“三种⽅法: ⼀是xml.dom. * 模块,它是W3CDOMAPI的实现

  • PHP使用XMLWriter读写xml文件操作详解

    本文实例讲述了PHP使用XMLWriter读写xml文件操作.分享给大家供大家参考,具体如下: 米扑科技旗下的多个产品,需要脚本自动生成sitemap.xml,于是重新温习一遍PHP XML读写操作. 读写xml的方式,主要围绕XMLWriter和XMLReader进行,前者用于生成xml,后者则是用来读取并解析xml 写入 xml test_xml_write.php <?php /** * mimvp.com * 2017.06.22 */ header("Content-type:

  • python读写xml文件实例详解嘛

    目录 xml文件:country.xml xml文件解读 读取文件: 增加新节点及修改属性值和文本 总结 xml文件:country.xml <data> <country name="shdi2hajk">231 <rank>1<NewNode A="1">This is NEW</NewNode></rank> <year>2008</year> <gdppc&

  • Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象进行处理就是对word文档的内容处理. 二,相关概念 如果需要读取word文档中的文字(一般来说,程序也只需要认识word文档中的文字信息),需要先了解python-docx模块的几个概念. 1,Docume

  • Python pandas 列转行操作详解(类似hive中explode方法)

    最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题.找了一番资料后成功了,记录一下. 1. 如果需要爆炸的只有一列: df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}) df Out[1]: A B 0 1 [1, 2] 1 2 [1, 2] 如果要爆炸B这一列,可以直接用explode方法(前提是你的pandas的版本要高于或等于0.25) df.explode('B') A B 0 1 1 1 1 2 2 2 1 3

  • python数据分析之文件读取详解

    目录 前言: 一·Numpy库中操作文件 二·Pandas库中操作文件 三·补充 总结 前言: 如果你使用的是Anaconda中的Jupyter,则不需要下载Pands和Numpy库:如果你使用的是pycharm或其他集成环境,则需要Pands和Numpy库 一·Numpy库中操作文件 1.操作csv文件 import numpy as np a=np.random.randint(0,10,size=(3,4)) np.savetext("score.csv",a,deliminte

  • Python Pandas数据处理高频操作详解

    目录 引入依赖 算法相关依赖 获取数据 生成df 重命名列 增加列 缺失值处理 独热编码 替换值 删除列 数据筛选 差值计算 数据修改 时间格式转换 设置索引列 折线图 散点图 柱状图 热力图 66个最常用的pandas数据分析函数 从各种不同的来源和格式导入数据 导出数据 创建测试对象 查看.检查数据 数据选取 数据清理 筛选,排序和分组依据 数据合并 数据统计 16个函数,用于数据清洗 1.cat函数 2.contains 3.startswith/endswith 4.count 5.ge

  • Python 修改CSV文件实例详解

    目录 前言 Python 修改CSV文件 前言 由于 CSV 文件仅仅是简单的文本文件,因此更新 CSV 文件中内容的最佳方式是首先读取文件中的数据,并将它们处理为 Python 内部对象,进行更改,然后以相同的格式覆盖原始数据. Python 修改CSV文件 在本节中,我们将学习如何使用 Python 修改 CSV 文件中的数据. 假设在CSV文件中有以下数据,其中用户 '1' 对电影 'Star Wars' 的评分有误,其实际评分为 7.9,因此需要修改此文件. User name Movi

  • python解析xml文件操作实例

    本文实例讲述了python解析xml文件操作的实现方法.分享给大家供大家参考.具体方法如下: xml文件内容如下: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first

  • Android 文件操作详解及简单实例

     Android 文件操作详解 Android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入门吧 首先是一个布局文件,这一点比较的简单,那就直接上代码吧. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

随机推荐