【译】:lxml.etree官方文档
本文翻译自:http://lxml.de/tutorial.html, 作者:Stefan Behnel
这是一个关于使用lxml.etree进行XML处理的教程。它简要介绍了ElementTree API的主要概念,以及一些简单的增强功能,使你的编程更容易。
有关API的完整参考,请参考生成的API文档。
内容:
• 元素类
· 元素是列表
· 元素以属性为特征
· 元素包含文本
· 使用XPath查找文本
· 树迭代
· 序列化
• ElementTree类
• 从字符串和文件解析
· fromstring()函数
· XML()函数
· parse()函数
· 解析器对象
· 增量解析
· 事件驱动解析
• Namespaces
• The E-factory
• ElementPath
导入lxml.etree的常见方法如下:
如果你的代码仅使用ElementTree API,并不依赖于特定的lxml.etree的任何功能,你还可以利用下面的导入方法:
为了编写可移植代码,本教程在例子中说明了API的哪一部分是由Fredrik Lundh的ElementTree库定义的原始ElementTree API的lxml.etree的扩展。
» 元素类
单个元素是ElementTree API的主要的容器对象。大多数XML树功能都是通过这个类访问的。元素可以通过Element factory轻松创建:
元素的XML标签名通过tag属性访问:
元素以XML树结构组织。要添加子元素并将其添加到父元素中,可以使用append()方法:
然而,这是很常见的。有一个更短更有效的方法做到这一点:SubElement factory。它接受与Element factory相同的参数,但要求父元素作为第一个参数:
要看到真正的XML,你可以序列化创建的树:
元素是列表
为了更容易、更直接的访问这些子元素,元素尽可能地模仿python列表的行为:
在ElementTree 1.3和lxml 2.0之前,你还可以检查一个元素的真值,看它是否有子代,即如果子列表为空:
这不再受支持,因为人们倾向于期待"something“被评估为True,期待元素成为"something”,它们可能有子代吗?所以很多用户惊奇的发现任何元素都会在上面的if语句中被评估为False。相反的,使用len(element)更明确,更少出错。
还有一种重要的情况,其中lxml(2.0及以上版本)中Elements的行为偏离了列表和原始的ElementTree(1.3之前的版本或Python2.7/3.2):
在这个例子中,最后一个元素被剪切到一个不同的位置,而不是复制,即当它被放在不同的位置时,它被自动从它前一个位置移除。在列表中,对象可以同时出现在多个位置,上述分配只会将item引用复制到第一个位置,以便两者都包含相同的item。
注意在原始的ElementTree中,单个的Element对象可以位于任意数量的树中的任意数量位置,这允许与列表相同的复制操作,明显的缺点是对这种元素的修改将会适用于它出现树中的所有地方,这可能是也可能不是初衷。
这个区别的优点是,lxml.etree中的Element总是具有一个父对象,可以通过getparent()方法进行查询。这在原始的ElementTree中是不支持的。
如果要将单个元素复制到lxml.etree中的不同位置,请考虑使用Python标准库中的复制模块来创建一个独立的深层副本:
元素的同胞(或邻居)作为下一个和前一个元素被访问:
元素以属性为特征
XML元素支持属性。你可以在Element factory直接创建它们:
属性只是无序的name-value对,所以处理它们非常方便的方法是通过Elements的类似字典的界面:
对于你想查找item或其他原因来获取一个'real'类似字典对象的情况,例如传递给它,你可以使用attrib属性:
注意attrib是由Element本身支持的类似dict的对象。这意味着对元素的任何修改都反映在属性中,反之亦然。这也意味着,只要一个元素的attrib在使用,XML树就活跃在内存中。要获取不依赖XML树的属性的独立快照,将其复制到dict中:
元素包含文本
元素可以包含文本:
在许多XML文档(以数据为中心的文档)中,这是唯一可以找到文本的地方。它由叶子标签封装在树层次结构的底部。
然而,如果XML用于标记的文本文档,例如(X)HTML,文本也可以出现在不同元素之间,就在树的中间:
这里,</br>标签由文本环绕。这通常被称为文本样式或混合内容XML。元素通过尾部属性来支持它。它包含直接跟随元素的文本,直到XML树中的下一个元素:
两个属性 .text和 .tail足以表示XML文档中的任何文本内容。这样,除了Element类之外,ElementTree API不需要任何特殊的文本节点,它往往会得到一些方法(正如你从传统的的DOM API中知道的那样)。
然而,有些情况下尾部文本也会妨碍。例如,当你从树中序列化一个元素时,你并不总是希望在结果中显示尾部文本(尽管你仍然希望其子代码的尾部文本)。为此,tostring()函数接受关键字参数with_tail:
如果你想读的只有文字,即没有任何中间变量,你必须递归串联所有文字和以正确的顺序属性。再次使用tostring()函数来救援,这次使用method关键字:
__EOF__

本文链接:https://www.cnblogs.com/my_captain/p/7490292.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?