Python xml.dom.minidom.Attr 问题
在Python中使用minidom获取属性时,可以用“attributes”这个属性。比如说,node.attributes["id"].value
。
假设我有一个代码:<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高手们能不能给我解释一下?
2 个回答
哎呀,之前从来没注意到这个。你说的没错,node.value
这个东西在任何地方都没提到。不过在代码里,确实是在 def __setitem__
这个地方被设置了,位置是在 xml.dom.minidom 里。
我也不知道该说什么,看来你得用这个了。
minidom
其实就是对xml.dom
接口的一种实现,所以关于minidom
的文档主要是讲它和xml.dom
之间的一些特别之处或者限制。
在xml.dom
的文档中,关于Attr的部分提到,引用如下:
Attr是从Node继承来的,所以它也继承了所有Node的属性。
而在关于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
属性还有一个没有文档说明的别名value
,这可能让人觉得不太好,但你可以选择使用文档中提到的、也就是比较“正确”的属性名nodeValue
。是的,这个名字比较长,但minidom
的很多东西都是这样的,而且它的速度也比优秀的xml.etree.ElementTree慢(尤其是后者的C语言实现xml.etree.cElementTree
),所以如果你选择使用minidom
,那大概是因为你喜欢这种冗长的写法...;-)。