Element.tagName для Python не работает
У меня есть следующий код в 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 ответа
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
2-й - это элемент, он содержит другие узлы. Узел такого типа имеет атрибут tagName.
Третий похож на первый.
Вы должны взглянуть на 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
как и ожидалось.
Первый элемент в childNodes (childNodes[0]) - это текст. Первый дочерний элемент начинается с элемента 1 дочернего узла.
На изображении ниже вы можете видеть, что элемент 0 имеет текст {instance} рядом с ним - так как это текстовый элемент. Ниже этого у элемента 1 есть Элемент {instance}, поскольку это элемент элемента.
Вы также можете видеть, что childNodes [0] имеет свойство 'wholeText' (представляющее текст), а элемент 1 childNodes имеет свойство 'tagName', которое является именем первого дочернего элемента. Поэтому вы не можете попытаться получить свойство tagName от childNodes[0].