Извлечение значений из XML с использованием Python - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть следующий 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 ]

1 голос
/ 20 апреля 2011

Если вы хотите получить атрибуты для каждого элемента в 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> в notificationlist.

for n in attrslist:
   status = n['status']
   oid = n['oid']
   name = n['name']
   # blah
0 голосов
/ 20 апреля 2011

Предполагая, что ваш 'messageslist = xmldoc.getElementsByTagName (' Notification ')' генерируется из xmldoc, который является выходным значением, которое вы перечислили, у вас должно быть четыре элемента.Таким образом, просто сосредоточив внимание на элементе 0 с уведомлением [0], мы будем обращаться только к этому первому элементу.Вот некоторый код с модификацией вашего samlpe 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
---------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...