5.6. 访问元素属性

XML元素可以有一个或多个属性,一旦你已经分析完XML文档,访问它们相当容易。

在这部分,我们将使用在上一节中看到的 binary.xml 语法文件。

Note

这一节由于某个涵义重叠的术语可能让人有点糊涂。在一个XML文档中元素拥有属性,而Python对象也拥有属性。当我们分析一个XML文档时,我们得到一组Python对象,它们代表XML文档的所有片段,同时这些Python对象中的某些还表示元素的属性。但是表示属性(XML)的对象(Python)也有(Python)属性,它们被用来访问对象所表示的属性(XML)的各个部分。我告诉过你它让人糊涂。我会公开关于如何更明显地区分这些不同的意见。

例 5.23. 访问元素属性

>>> xmldoc = minidom.parse('binary.xml')
>>> reflist = xmldoc.getElementsByTagName('ref')
>>> bitref = reflist[0]
>>> print bitref.toxml()
<ref id="bit">
  <p>0</p>
  <p>1</p>
</ref>
>>> bitref.attributes          1
<xml.dom.minidom.NamedNodeMap instance at 0x81e0c9c>
>>> bitref.attributes.keys()   2 3
[u'id']
>>> bitref.attributes.values() 4
[<xml.dom.minidom.Attr instance at 0x81d5044>]
>>> bitref.attributes["id"]    5
<xml.dom.minidom.Attr instance at 0x81d5044>
1

每个 Element 对象拥有一个叫做 attributes 的属性,它是一个 NamedNodeMap 对象。听上去挺吓人,其实不然,因为 NamedNodeMap 是一个行为象字典的对象,那么你已经知道怎么使用它了。

2

NamedNodeMap 视同为字典,我们可以使用 attributes.keys() 来获得这个元素属性的名字列表。这个元素仅有一个属性, 'id'

3

象其它所有在XML文档中的文本一样,属性名字以unicode编程保存。

4

再次将 NamedNodeMap 视同为字典,我们可以使用 attributes.values() 来获得属性值的列表。这些值是类型 Attr 对象本身。在下个例子中,我们将看到如何从这对象得出有用的信息。

5

仍然将 NamedNodeMap 视同为字典,使用正常的字典语法,我们可以通过名字来访问一个单个的属性。(那些非常认真的读者将已经知道 NamedNodeMap 类是如何实现这一灵巧的技巧的:通过定义一个__getitem__ 特别方法。其它的读者可能乐意接受这一事实:他们不需要理解它是如何工作的就可以有效地使用它。)

例 5.24. 访问单个属性

>>> a = bitref.attributes["id"]
>>> a
<xml.dom.minidom.Attr instance at 0x81d5044>
>>> a.name  1
u'id'
>>> a.value 2
u'bit'
1

Attr 对象整个地表示单个XML元素的单个属性。属性的名字(同我们用来在 bitref.attributes NamedNodeMap 伪字典中找到这一对象的名字相同)存储在 a.name 中。

2 这个XML属性实际的文本被存储在 a.value
Note

象字典一样,XML元素的属性没有顺序。属性可能碰巧按原始XML文档的某种顺序被列出,同时 Attr 对象可能碰巧按XML文档被分析成Python对象时的某种顺序列出。但这些对象是随意的并不带有某种涵义。你应该总是通过名字来访问单个属性,如同字典的关键字。