Проблемы с получением element.tagName. Разбор XML с помощью Python и xml.dom.minidom
Я анализирую XML с помощью Python (xml.dom.minidom) и не могу получить tagName узла.
Переводчик возвращается:
AttributeError: Text instance has no attribute 'tagName'
когда я пытаюсь извлечь (например) строку 'format' из узла:
<format>DVD</format>
Я нашел пару очень похожих постов здесь, в Starckoverflow, но я до сих пор не могу найти решение.
Я знаю, что могут быть альтернативные модули для решения этой проблемы, но я намерен понять, ПОЧЕМУ она терпит неудачу.
Большое спасибо заранее и наилучшими пожеланиями,
Вот мой код:
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document
xml = xml.dom.minidom.parse("movies.xml")
# collection Node
collection_node = xml.firstChild
# movie Nodes
movie_nodes = collection_node.childNodes
for m in movie_nodes:
if len(m.childNodes) > 0:
print '\nMovie:', m.getAttribute('title')
for tag in m.childNodes:
print tag.tagName # AttributeError: Text instance has no attribute 'tagName'
for text in tag.childNodes:
print text.data
А вот и XML:
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
</collection>
Похожие посты:
2 ответа
Ошибка произошла из-за того, что новые линии между узлами элемента считаются другим узлом, который имеет тип TEXT_NODE (см. Node.nodeType), и TEXT_NODE не имеет tagName
приписывать.
Вы можете добавить проверку типа узла, чтобы избежать печати tagName
из текстовых узлов:
if tag.nodeType != tag.TEXT_NODE:
print tag.tagName
Вот так выглядит код с модификацией, предложенной пользователем: har07.
for tag in m.childNodes:
if tag.nodeType != tag.TEXT_NODE:
for text in tag.childNodes:
print tag.tagName, ':', text.data
Теперь это работает как шарм.