Проблемы с получением 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>

Похожие посты:

Получить имя узла с минидомом

Element.tagName для Python не работает

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

Теперь это работает как шарм.

Другие вопросы по тегам