开发者问题收集

如何解析 XML 并获取特定节点属性的实例?

2009-12-16
1566746

我的 XML 中有许多行,我正在尝试获取特定节点属性的实例。

<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>

如何访问属性 foobar 的值?在此示例中,我想要 “1”“2”

3个回答

我建议使用 ElementTree 。Python 标准库本身中还有其他兼容的相同 API 实现,例如 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)

输出:

1
2
Alex Martelli
2009-12-16

minidom 是最快且非常直接的。

XML:

<data>
    <items>
        <item name="item1"></item>
        <item name="item2"></item>
        <item name="item3"></item>
        <item name="item4"></item>
    </items>
</data>

Python:

from xml.dom import minidom

dom = minidom.parse('items.xml')
elements = dom.getElementsByTagName('item')

print(f"There are {len(elements)} items:")

for element in elements:
    print(element.attributes['name'].value)

输出:

There are 4 items:
item1
item2
item3
item4
Ryan Christensen
2009-12-16

您可以使用 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'
YOU
2009-12-16