使用Python从XML提取值
我有以下从另一个xml文件提取出来的xml内容。
<notifications>
<notification name="ccmSmtp" oid="1.3.6.1" status="current">
<objects>
<object module="callhome" name="ccmSmtp" />
</objects>
<description>This is a description</description>
</notification>
<notification name="ccmAlertGroup" oid="1.3.6.1" status="current">
<objects>
<object module="callhome" name="callHome" />
</objects>
<description>This is a description</description>
</notification>
<notification name="ccmAlert" oid="1.3.6.1" status="current">
<objects>
<object module="callhome" name="callHome" />
</objects>
<description>This is a description</description>
</notification>
<notification name="ccmSmtp" oid="1.3.6.1" status="current">
<objects></objects>
<description>This is a description</description>
</notification>
</notifications>
我正在使用以下的Python代码。
from xml.dom import minidom
xmldoc = minidom.parse('example.xml')
grammarNode = xmldoc.childNodes[2]
notificationsNode = grammarNode.childNodes[9]
print notificationsNode.toxml()
这段Python代码会输出我上面给出的xml内容。
我尝试了以下方法来获取属性值。
notificationlist = xmldoc.getElementsByTagName('notification')
print notificationlist[0].toxml()
notification1 = notificationlist[0]
key = notification1.attributes.keys()
通过这个方法,我只能获取到第一组通知的值。
我该怎么做才能获取所有属性的值,并把它们存储在不同的变量中呢?
2 个回答
0
假设你的 'notificationlist = xmldoc.getElementsByTagName('notification')' 是从你提到的 xmldoc 生成的,那么你应该会有四个元素。因此,专注于第一个元素 notificationlist[0] 只会处理第一个元素。下面是一些代码,修改了你的示例 xmldoc,使得描述前面加上 aaa、bbb、ccc、ddd。你可以通过替换打印语句来获取数据---
for x in notificationlist:
print '*' * 15
print x.getElementsByTagName('description').item(0).childNodes[0].data
print
for y in x.attributes.keys():
print y
print x.attributes.getNamedItem(y).nodeValue
print '-' *15
***************
aaaThis is a description
status
current
---------------
oid
1.3.6.1
---------------
name
ccmSmtp
---------------
***************
bbbThis is a description
status
current
---------------
oid
1.3.6.1
---------------
name
ccmAlertGroup
---------------
***************
cccThis is a description
status
current
---------------
oid
1.3.6.1
---------------
name
ccmAlert
---------------
***************
dddThis is a description
status
current
---------------
oid
1.3.6.1
---------------
name
ccmSmtp
---------------
1
如果你想获取notificationlist
中每个项目的属性,你可以这样做:
attrslist = [dict(node.attributes.items()) for node in notificationlist]
print attrslist[0]
# => {u'status': u'current', u'oid': u'1.3.6.1', u'name': u'ccmSmtp'}
print attrslist[0]['status']
# => current
接下来,你只需要遍历这个新列表,然后根据名称提取每个<notification>
元素的属性。
for n in attrslist:
status = n['status']
oid = n['oid']
name = n['name']
# blah