使用Python从XML提取值

2 投票
2 回答
1266 浏览
提问于 2025-04-16 16:06

我有以下从另一个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

撰写回答