我在包含 xml 的数据库中有很多行,我正在尝试编写一个 Python 脚本,该脚本将遍历这些行并计算特定节点属性的实例数量。例如,我的树看起来像:
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
如何使用 Python 访问 XML 中的属性 1 和 2?
我建议ElementTree
。同一 API 的其他兼容实现,例如 Python 标准库本身中的lxml
和cElementTree
; 但是,在这种情况下,他们主要添加的内容更快 - 编程部分的简易性取决于ElementTree
定义的 API。
首先从 XML 构建一个 Element 实例root
,例如使用XML函数,或者使用以下内容解析文件:
import xml.etree.ElementTree as ET
root = ET.parse('thefile.xml').getroot()
或者在ElementTree
展示的许多其他方式中的任何一种。然后做一些事情:
for type_tag in root.findall('bar/type'):
value = type_tag.get('foobar')
print(value)
类似的,通常很简单的代码模式。
minidom
是最快捷,最直接的:
XML:
<data>
<items>
<item name="item1"></item>
<item name="item2"></item>
<item name="item3"></item>
<item name="item4"></item>
</items>
</data>
蟒蛇:
from xml.dom import minidom
xmldoc = minidom.parse('items.xml')
itemlist = xmldoc.getElementsByTagName('item')
print(len(itemlist))
print(itemlist[0].attributes['name'].value)
for s in itemlist:
print(s.attributes['name'].value)
OUTPUT
4
item1
item1
item2
item3
item4
你可以使用BeautifulSoup
from bs4 import BeautifulSoup
x="""<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>"""
y=BeautifulSoup(x)
>>> y.foo.bar.type["foobar"]
u'1'
>>> y.foo.bar.findAll("type")
[<type foobar="1"></type>, <type foobar="2"></type>]
>>> y.foo.bar.findAll("type")[0]["foobar"]
u'1'
>>> y.foo.bar.findAll("type")[1]["foobar"]
u'2'