2010-05-07 2 views
3

Получение атрибутов с использованием minidom в Python, используется свойство «attributes». например node.attributes["id"].valuepython xml.dom.minidom.Attr question

Так что если у меня есть <a id="foo"></a>, это должно дать мне "foo". node.attributes["id"] не возвращает значение именованного атрибута, но экземпляр xml.dom.minidom.Attr. Но, глядя на помощь для Attr, делая help('xml.dom.minidom.Attr'), никуда это волшебство "value" свойство упомянуто. Мне нравится изучать API, глядя на иерархию типов, методы экземпляра и т. Д. Откуда взялось это свойство "value"? Почему он не указан на странице класса Attr? Единственными указанными дескрипторами данных являются isId, localName и schemaType. Его также не унаследовали от каких-либо суперклассов. Поскольку я новичок в Python, будут ли просвещены некоторые из гуру Python?

ответ

4

minidom это просто реализации из xml.dom интерфейсов, поэтому любые документы конкретно на minidom будут только о его особенностях и ограничениях WRT xml.dom сам.

В xml.dom документы на Attr говорят, и я цитирую:

атр наследует от узла, поэтому наследует все его атрибуты.

Документы на Node фактически называют атрибут по-разному: nodeValue. Но, на самом деле ...:

>>> import xml.dom.minidom as xdm 
>>> dom = xdm.parseString('<foo bar="baz"/>') 
>>> root = dom.documentElement 
>>> atr = root.getAttributeNode('bar') 
>>> atr.nodeValue 
u'baz' 

Тот факт, что документально nodeValue атрибут имеет _un_documented псевдоним value можно считать неудачным, но вы всегда можете придерживаться документально, и поэтому, возможно, право, имя атрибута, nodeValue. Да, это многословное, но так все minidom, а также медленнее, чем отличный xml.etree.ElementTree (особенно в реализации C последней, xml.etree.cElementTree), так что, вероятно, если вы решите использовать minidom это должно быть, потому что вы как обширными многословие ... ;-).

+0

Спасибо. ElementTree слишком отличается от XML DOM-обработки, к которой я привык на других языках, поэтому пошел с мини-министром. Страница help (xml.dom.minidom.Attr) не указала nodeValue в разделах «унаследованные от» или «xml.dom.Node», хотя она явно унаследована. Есть ли способ проверить (как в отражении) классы и типы Python, не полагаясь на страницы документации «help», которые предпочитают выборочно пропускать ключевые (public!) Свойства или методы? – rudy

+0

@rudy, 'inspect.getmembers (atr)' покажет вам все 65 атрибутов и методов (в виде пар '(name, value)') объекта 'atr'. Конечно, вы можете быть более избирательным. –

+0

Grrreat! Только то, что мне было нужно. Спасибо, Алекс! – rudy

0

Geez, никогда не замечал этого раньше. Вы не шутите, node.value нигде не упоминается. Он определенно устанавливается в коде, хотя под def __setitem__ в xml.dom.minidom.

Не уверен, что сказать иначе, похоже, вам придется это использовать.