Разбор XML с использованием минидома в Python - PullRequest
0 голосов
/ 14 мая 2018

Я новичок в Python и нуждаюсь в небольшом совете по одному из моих проектов от экспертов.

У меня есть XML-файл, который мне нужно проанализировать, а затем отсортировать. Ниже приведен пример XML-файла

<Product_Key Name="Visio Professional 2002" KeyRetrievalNote="">
    <Key ID=“XXX” Type="Static Activation Key">12345-67890</Key>
</Product_Key>


<Product_Key Name="Visio Professional 2008" KeyRetrievalNote="">
    <Key ID=“XXX” Type="Static Activation Key">23456-78901</Key>
</Product_Key>


<Product_Key Name="Visio Professional 2012" KeyRetrievalNote="">
    <Key ID=“XXX” Type="Static Activation Key">34567-89012</Key>
</Product_Key>


<Product_Key Name="Visio Professional 2016” KeyRetrievalNote="">
    <Key ID=“XXX” Type="Static Activation Key">45678-90123</Key>
</Product_Key>

Ниже приведен вывод, который я пытаюсь достичь

Visio Professional 2002:   12345-67890
Visio Professional 2008:   23456-78901
Visio Professional 2012:   34567-89012
Visio Professional 2016:   45678-90123

Я пытаюсь получить название продукта и перед ним соответствующий ключ продукта.

Я могу получить вывод, как показано ниже, но это не то, что я ищу.

Visio Professional 2002
Visio Professional 2008
Visio Professional 2012
Visio Professional 2016 
12345-67890
23456-78901
34567-89012
45678-90123

Ниже приведен фрагмент кода, который я использовал.

import xml.dom.minidom

def main():
  doc = xml.dom.minidom.parse("keysexport.xml")
  names = doc.getElementsByTagName("Product_Key")
  keys = doc.getElementsByTagName("Key")

  for name in names:
    print(name.getAttribute("Name"))

  for key in keys:
    print(key.firstChild.nodeValue)

if __name__ == "__main__":
  main();

1 Ответ

0 голосов
/ 14 мая 2018

Вы сделали большую часть работы самостоятельно. Поздравляю.

Существует много способов достижения вашей конечной цели, одним из них является следующее: теперь, когда вы получили список names и keys, вы можете объединить их для создания словаря, а затем выполнить итерацию по словарю, чтобы получите подходящий вывод, который вы ищете.

Итак, ваша программа может выглядеть так:

import xml.dom.minidom

def main():
  doc = xml.dom.minidom.parse("keysexport.xml")
  names = doc.getElementsByTagName("Product_Key")
  keys = doc.getElementsByTagName("Key")
  #Use the previous lists to create a dictionary
  products = dict(zip(names, keys)) 
  #Loop over the dictionary of products and display the couple key: value
  for product_key, product_value in products.items():
      print('{}:  {}'.format(product_key.getAttribute('Name'), product_value.firstChild.nodeValue))


if __name__ == "__main__":
  main()

Демо:

>>> names = xmldoc.getElementsByTagName("Product_Key")
>>> keys = xmldoc.getElementsByTagName("Key")
>>> products = dict(zip(names, keys))
>>> for product_key, product_value in products.items():
...     print('{}:  {}'.format(product_key.getAttribute('Name'), product_value.firstChild.nodeValue))
... 
Visio Professional 2002:  12345-67890
Visio Professional 2008:  23456-78901
Visio Professional 2012:  34567-89012
Visio Professional 2016:  45678-90123
...