python处理xml文件

2023-10-30

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模块

2.1 解析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>

根据xsd生成xml文件

import xmlschema
import json
from xml.etree.ElementTree import ElementTree

my_xsd = '<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="note" type="xs:string"/> </xs:schema>'

schema = xmlschema.XMLSchema(my_xsd)
data = json.dumps({'note': 'this is a Note text'})

xml = xmlschema.from_json(data, schema=schema, preserve_root=True)

ElementTree(xml).write('my_xml.xml')

对于更复杂的 xsd,我更喜欢使用 generateDS,它甚至可以为非常大的 xsd 文件创建非常非常可靠的类.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python处理xml文件 的相关文章

  • Android 上的自定义视图和窗口属性

    我想要做的是在我的应用程序顶部添加一个视图 该视图类似于过滤器视图 我想操纵屏幕的颜色 并且我还希望能够同时更改屏幕的亮度时间 这两件事似乎是分开起作用的 但不能一起起作用 这是我的代码 添加视图 colourView new Layer
  • 在循环中动态添加方法时的范围问题

    我有一个 API 用于分析我的锻炼数据 我抓取的数据 跑卫 http runkeeper com 的网站 我的主类是一个子类pandas DataFrame 它基本上是表格数据的容器 它支持按列名索引 返回列值的数组 我想根据数据中存在的
  • 何时在 Gevent 中使用线程池

    我注意到 Gevent 有线程池对象 有人可以向我解释何时使用线程池以及何时使用常规池吗 gevent threadpool 和 gevent pool 有什么区别 当你有一段需要很长时间运行 几秒钟 并且不会导致 greenlet 切换的
  • TypeError: 'module' 对象不可调用错误 driver=webdriver("C:\\Python34\\Lib\\site-packages\\selenium\\webdriver\\chromedriver.exe")

    我在 Pycharm 中遇到类似错误 Traceback most recent call last File C PycharmProjects DemoPyth PythonPack1 Prg1 py line 3 in
  • 标记 pandas 系列中连续的 True 元素组

    我有一系列的 pandas 布尔值 我想标记连续的 True 值组 怎么可能做到这一点 是否可以以矢量化的方式做到这一点 任何帮助将不胜感激 Data A 0 False 1 True 2 True 3 True 4 False 5 Fal
  • C3P0:生产中未返回的连接超时?

    参数unreturnedConnectionTimeout给定时间段后未返回的连接超时 我正在尝试决定是否应该在我的制作中使用它persistence xml 使用它的一大优点是连接池将能够从泄漏的连接中恢复 一个很大的缺点是泄漏的连接将很
  • 在Python中将字符串转换为变量? [复制]

    这个问题在这里已经有答案了 我对 python 和编程都很陌生 并且已经尝试弄清楚如何做到这一点有一段时间了 这是我需要帮助的内容 y 0 x 2 p01 hello p02 bye print p str y str x 输出当然是 p0
  • 虎鲸失踪

    使用plotly 导出静态图表时遇到小问题 Plotly 无法正确识别我已安装 orca 并且仍然存在与缺少 orca 相关的错误 我尝试更改 orca 目录 但它仍然无法正常工作 谁知道出了什么问题吗 My code import plo
  • 熊猫:SettingWithCopyWarning:[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码将列转换为 日期 df DATE pd to datetime df DATE or df DATE pd to datetime df DATE 但我收到以下错误 Users xyz anac
  • PDB.run - 重新启动 pdb 会话

    我对 python 和 pdb 比较陌生 但我对 gdb 有很多经验 我的问题是 如果我在代码中设置了多个断点 我会想要更改一些内容并重新运行我的调试会话并保留这些断点 但是 在我的 pdb 会话中输入 run 会导致我的会话终止并显示以下
  • System.out.println("嗨"+6+10);打印Hi610?

    为什么要这样做 太令人困惑了 运算符优先级和结合性 两点 操作员 如果一个或两个参数都是字符串 则进行字符串连接 操作员 从左到右工作 所以在你的例子中 Hi 6 is Hi6 and Hi6 10 is Hi610 编辑 正如您在对另一个
  • Django - 以表单形式访问 request.session

    我按如下方式调用表单 然后将其传递给模板 f UserProfileConfig request 我需要能够访问表单中的 request session 所以首先我尝试了这个 class UserProfileConfig forms Fo
  • Python Flask 不更新图像[重复]

    这个问题在这里已经有答案了 这里有一些关于图像的 Flask 问题 但没有一个能解决我的问题 我有一个应用程序可以创建图像 保存它 然后显示它 一次 它应该多次执行此操作 每次更改图像时 它应该加载新图像 它不是 它只显示与其显示的文件名关
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons
  • AttributeError:模块“matplotlib”没有属性“font_manager”

    我安装了 matplotlib 但 python 3 8 10 显示了这个错误 AttributeError module matplotlib has no attribute font manager What i am doing w
  • Python - 使用 BeautifulSoup 从 URL 列表中抓取文本的最简单方法

    使用 BeautifulSoup 从几个网页 使用 URL 列表 中抓取文本的最简单方法是什么 有可能吗 最好的 乔治娜 import urllib2 import BeautifulSoup import re Newlines re c
  • 从多个 .csv 文件创建混淆矩阵

    我有很多具有以下格式的 csv 文件 338 800 338 550 339 670 340 600 327 500 301 430 299 350 284 339 284 338 283 335 283 330 283 310 282 3
  • Hibernate 命名查询使用 Like 和 % % 运算符?

    在我的 Hibernate JPA 示例代码中 public List
  • Java分数计算器

    我对 Java 编程还很陌生 我的 AP 计算机编程课程有作业要完成 所以请耐心等待 我必须弄清楚如何将两个分数相乘 我想知道是否有任何方法可以在方法内部声明变量并在该方法外部使用它 我在介绍方法中的 while 循环 谢谢您 希望这不会令
  • 是什么让热部署成为“难题”?

    在工作中 我们经常遇到这样的问题 永久代内存不足 http www jroller com agileanswers entry preventing java s java lang例外 团队负责人认为这是 JVM 中的一个错误 与代码的

随机推荐

  • mimo节能模式选哪种_802.11协议精读11:节能模式(APSD,PSMP,SMPS)

    序言 在802 11主要的版本中 总共定义了四种节能模式 在前面一篇文档中 我们介绍了最基本的PSM模式 以及其工作方式上的一些细节 由于PSM是在最初的802 11协议下进行的设计 其用了较为保守设计 以确保最稳定的运行需求 在后来的80
  • 次时代Java编程(一):Java里的协程

    声明 本文CSDN作者原创投稿文章 未经许可禁止任何形式的转载 作者 刘小溪 Maxleap的高级开发工程师 喜欢倒腾一些有意思的技术框架 对新的技术以及语言非常有兴趣 以前在shopex担任架构师 目前在Maxleap负责基础架构以及服务
  • nohup保存代码打印结果至指定文件

    nohup python xxx py gt gt xxx out 以python为例 上述指令可以让xxx py在后台运行 并且输出结果保存至xxx out文件
  • 牛客 NC202492 仓库选址

    题目链接 https ac nowcoder com acm problem 202492 代码 include
  • Chrome 谷歌浏览器 google 复制网页上禁止复制的文本

    在你要复制文字的页面 按F12 选择 Console 输入 document body innerText 然后按回车
  • 用python画一只可爱的皮卡丘

    效果图 usr bin env python coding utf 8 from turtle import 绘制皮卡丘头部 def face x y 画脸 begin fill penup 将海龟移动到指定的坐标 goto x y pen
  • Grafana中文版本

    grafana chinese tags GitHub grafana Grafana中文汉化版本 GitHub https github com WangHL0927 grafana chinese 作者 whl email w95866
  • Vuepress码云部署及自动跳转404 的问题

    介绍 VuePress 由两部分组成 一个以 Vue 驱动的主题系统的简约静态网站生成工具 和一个为编写技术文档而优化的默认主题 它是为了支持 Vue 子项目的文档需求而创建的 由 VuePress 生成的每个页面 都具有相应的预渲染静态
  • PyCharm+Docker:打造最舒适的深度学习炼丹炉

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 来自 知乎 作者 刘震 链接 https zhuanlan zhihu com p 52827335 编辑 人工智能前沿讲习 一般炼丹都在服务器上 很少有人在本机跑代码的
  • 跨时钟域信号处理(一)--Verilog单比特信号

    网上有很多的跨时钟域信号处理的相关文章 主要分为三种 单比特信号 打两拍或打更多拍 使用触发器 多比特信号 异步双口块RAM或者异步FIFO 格雷码转换 这次就主要说第1种情况 适用于单比特信号 1 应用场景 从时钟域1的单比特信号DATA
  • 【python】动态规划算法学习:0-1背包问题 -牛客网HJ16 购物单

    这里写目录标题 题目HJ16 购物单 问题理解 代码 题目HJ16 购物单 描述 王强决定把年终奖用于购物 他把想买的物品分为两类 主件与附件 附件是从属于某个主件的 下表就是一些主件与附件的例子 主件 附件 电脑 打印机 扫描仪 书柜 图
  • Git(三) Git 图形化管理工具 SourceTree 全部实用操作

    Git 三 Git 图形化管理工具 SourceTree 全部实用操作 上篇文章主要说到Git的账号情况 Getlab账号和Github账号同时使用 本篇文章接着上篇内容继续为大家介绍 Git的图形化管理工具 SourceTree 前言 一
  • 文件下载中文文件名不显示

    使用response setHeader Content Disposition attachment filename fName 下载文件 中文文件名无法显示的问题 今天遇到这么一个情况 在Controller代码中进行文件下载 其中f
  • js 多个if else如何优化?

    function getUserDescribe name if name length gt 3 console log 名字太长 else if name length lt 2 console log 名字太短 else if nam
  • 导入时报错 :No module named ‘tensorflow.contrib‘ 问题的解决

    No module named tensorflow contrib 问题解决 问题描述 在tensorflow contrib模块的调用报错 No module named tensorflow contrib 解决方案 我给删了大不了不
  • [CISCN2019 华北赛区 Day1 Web2]ikun (JWT更改与python反序列化)

    前言 文章所涉及的资料来自互联网整理和个人总结 意在于个人学习和经验汇总 如有什么地方侵权 请联系本人删除 谢谢 本文仅用于学习与交流 不得用于非法用途 题目 提示是要买到Iv6 有很多页面 需要写脚本来找 import requests
  • 基于时间轮片方式处理超时任务

    作者 酱了里个酱 来源 掘金 https juejin im post 5e733e4f51882549417fe9aa 背景 最近收到小伙伴的一个吐槽 项目里的某个函数是同步阻塞的 无法确定其运行时间 某些情况下 可能出现长时间阻塞导致应
  • 计算机视觉与深度学习-全连接神经网络-激活函数- [北邮鲁鹏]

    文章目录 基础知识 为什么需要非线性操作 激活函数 激活函数 vs 数据预处理 常用的激活函数 Sigmoid函数 Logistic函数 双曲正切函数 Tanh函数 线性整流函数 ReLU函数 Leaky ReLU函数 Softmax函数
  • BTC txid与vote的关系

    当我通过BTC的listtransactions接口获取查询最近发生的钱包交易时 需要将用户的充值记录写到数据库时 发现了一些令人巨大的误解 例如 txid字段并不是唯一的 所以写到数据库时 会有交易哈希重复的可能性 有可能你的两个用户在币
  • python处理xml文件

    1 python 操作xml的方式介绍 查看全部包含 三种 法 是xml dom 模块 它是W3CDOMAPI的实现 若需要处理DOMAPI则该模块很适合 是xml sax 模块 它是SAXAPI的实现 这个模块牺牲了便捷性来换取速度和内存