Тот факт, что вы не представили действительные данные XML (поскольку отсутствует корневой элемент), предлагает различные способы решения вашей проблемы. Но все эти методы очень похожи и основаны на использовании nodeValue
. Ниже приведено решение.
Мы предполагаем, что у нас есть ваш действительный файл XML (и я знаю, что у вас есть один):
>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('AAPL.xml')
Оттуда мы будем искать элементы, имеющие данные в качестве имени тега:
>>> datums = xmldoc.getElementsByTagName('datum')
datums
- список всех объектов документа XML, имеющих имя тега datum ; и это на самом деле включает в себя тот, который вам не нужен: их родительский узел <datum type="array">
.
Таким образом, мы перебираем эти datums
(и исключаем родительский) для отображения их текста.
Обратите внимание, что текст 178.25 ниже является дочерним узлом элемента datum
.
<datum type="float">178.25</datum>
Вот почему нам нужно выполнить цикл следующим образом:
>>> for datum in datums:
... if datum.getAttribute('type') != 'array': #exclude the parent datum
... print(datum.childNodes[0].nodeValue)
Поскольку у datum есть список дочерних узлов, который состоит только из одного элемента (текстового элемента), нам нужно написать datum.childNodes[0]
для доступа к нему. Как только мы позиционируем себя в этом текстовом элементе, мы можем прочитать его содержимое, вызвав nodeValue
, упомянутый ранее.
А вот и вывод:
>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('AAPL.xml')
>>> datums = xmldoc.getElementsByTagName('datum')
>>> for datum in datums:
... if datum.getAttribute('type') != 'array':
... print(datum.childNodes[0].nodeValue)
...
2018-05-04
178.25
184.25
178.17
183.83
56201317.0
0.0
1.0
178.25
184.25
178.17
183.83
56201317.0