Element.tagName для Python не работает - PullRequest
2 голосов
/ 26 ноября 2011

У меня есть следующий код в django, и он возвращает ошибку об атрибуте tagName:

def _parse_google_checkout_response(response_xml):
    redirect_url=''
    xml_doc=minidom.parseString(response_xml)
    root = xml_doc.documentElement
    node=root.childNodes[1]
    if node.tagName == 'redirect-url':
        redirect_url=node.firstChild.data
    if node.tagName == 'error-message':
        raise RuntimeError(node.firstChild.data)
    return redirect_url

Вот ответ об ошибке:

Exception Type: AttributeError
Exception Value:    
Text instance has no attribute 'tagName'

Кто-нибудь знает, какчто здесь происходит?

Ответы [ 3 ]

1 голос
/ 03 июля 2012
node=root.childNodes[1]

узел является текстовым узлом DOM.У него нет атрибута tagName.например,

>>> d = xml.dom.minidom.parseString('<root>a<node>b</node>c</root>')
>>> root = d.documentElement
>>> nodes = root.childNodes
>>> for node in nodes:
...   node
...
<DOM Text node "u'a'">
<DOM Element: node at 0xb706536c>
<DOM Text node "u'c'">

В приведенном выше примере элемент документа («корень») имеет 3 дочерних узла.Первый - текстовый узел, у него нет атрибута tagName.Вместо этого к его содержимому можно получить доступ по атрибуту data: root.childNodes[0].data

Второй элемент - это элемент, он содержит другие узлы.Узел такого типа имеет атрибут tagName.

3-й аналогичен 1-му.

1 голос
/ 26 ноября 2011

Вы должны взглянуть на XML, который вы получаете. Возможно, проблема в том, что вы получаете не только теги в корневом узле, но и текст.

Например:

>>> xml_doc = minidom.parseString('<root>text<tag></tag></root>')
>>> root = xml.documentElement
>>> root.childNodes
[<DOM Text node "u'root node '...">, <DOM Element: tag at 0x2259368>]

Обратите внимание, что в моем примере первый узел является текстовым, а второй - тегом. Таким образом, root.childNodes[0].tagName вызывает то же исключение, которое вы получаете, тогда как root.childNodes[1].tagName возвращает только tag, как и ожидалось.

0 голосов
/ 23 октября 2014

Первым элементом в childNodes (childNodes [0]) является текст.Первый дочерний элемент начинается с элемента 1 дочернего узла.

На рисунке ниже вы можете видеть, что элемент 0 имеет текст {instance} рядом с ним - так же, как и текстовый элемент.Ниже у элемента 1 есть Элемент {instance}, так как он является элементом элемента.

Вы также можете видеть, что childNodes [0] имеет свойство «wholeText» (представляющее текст), в то время как элемент 1 childNodes имеетсвойство 'tagName', которое является именем первого дочернего элемента.Поэтому вы не можете попытаться получить свойство tagName из childNodes [0].

Example of childNodes items zero and one

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...