用Python操作XML
来源:https://hackingandslacking.com/dealing-with-xml-in-python-b577630294b0
作者:Todd Birchard
翻译:老齐
阅读本文大约需要4分钟
生活中充满了我们不想做的事情,作为一个开发者,可能比一般人对此更有体会。有时我们会因为一个不讲道理、缺少知识的甲方(或者说是老板、产品经理等)而浪费几个星期的时间。另外浪费时间的地方,就是我们需要处理XML。
在某些情况下,API需要以XML格式返回数据。我们可能会想,“我只需要导入Python标准的 XML包就行了,然后了解一些语法,就可以开始了。”我原来也是这么想的。今天,我们将使用XML ElementTree库完成有关操作,从中你会了解到实际情况并非如想象那样。
和往常一样,这样做的目的是希望能够避免某些人的痛苦。在XML成为你的问题之前,请随意把它放在你的后兜中,我也在这样做。
不会那么糟
让我们提前做一些准备,以避免后续可能遇到的混乱。
首先,你是不是认为,可以用点符号来表示树状对象的分支?很遗憾,这种操作不能在XML中实现。如果寻找一个父对象的子对象,parent.child
根本不起作用(parent['child']
也不起作用)。我希望你喜欢在绕着树兜圈子。
读取XML中某个项的值时,所显示的结果既不是该项的值,也不是该项的子项。相反,结果显示:,这种显示说明它是一类Python对象。我们可以使用
.text
来查看文本值,而不是查看XML元素。不过,祝你在另一件事上好运。
生成XML树
让我们来解决这个问题并生成一些XML树,假设我们从一个API响应开始。
import xml.etree.ElementTree as ET e = ET.fromstring(response.content)
如果要阅读XML文件,则必须读取该文件并以目录的方式显示出来,即使这与我们无关,也应该意识到读取文件和显示内容的不一致性,以避免未来的混淆:
e = ET.parse('data.xml') root = e.getroot()
★在《跟老齐学Python:轻松入门》第6.7.1节,专门对操作XML进行了完整而详细的阐述,请参考阅读。
”
当我们遍历这棵树时,需要注意与XML数据交互的三种方式:
Water Frat 0 Urine Ironic 1 Pretentious Hipster 2
item.tag
返回tag的名称。对第一项运行此操作将返回beer和一个关联的URI。item.attrib()
返回指定项的属性和值({‘name’: ‘Bud Light’}
)item.text
返回介于打开和关闭标记之间的文本内容(如果该值存在的话)。
查找
有几种方法可以在XML中找到指定的数据,其中最明显的是通过索引进行搜索。item[0][1]
行得通,不过我觉得基于索引的搜索对你没有多大用处。
.find
和 .findall
方法
xml.etree.ElementTree库内置了.find
和.findall
方法,可以让我们对树进行操作。作为循环的一部分,我们按元素名称搜索:
for beer in e.findall('beer'): name = beer.get('name') # equivalent to .attrib() in this case flavor = beer.find('flavor').text print(name, " is ", flavor)Bud Light is Water PBR is Urine IPA is Pretentious
.iter()
方法
我们可以使用.iter()
,循环遍历所有出现的元素名。
for beertype in e.findall('beer'): print(beertype)Frat Ironic Hipster
使用某种糟糕的循环
如果你和我一样,可能会跳过所有的文档,变得非常沮丧,创建一些像这样的垃圾:
for beer in e: for properties in beer: if item.tag == "{http://www.example.com/beermodel/resources}Type": print(type)FratIronicHipster
这太糟糕了,但我不能说:你必须过你自己的生活。你就是你。
结论
看,XML很糟糕: 不到迫不得已,就不要使用它。如果你用到了它,要详细了解,就请阅读《跟老齐学Python:轻松入门》中的有关章节,本文仅仅是简要介绍,不能替代系统学习。
★关注微信公众号:老齐教室。读深度文章,得精湛技艺,享绚丽人生。
”
★点击“阅读原文”,优惠购买《跟老齐学Python:轻松入门》
”