9.6. 访问元素属性

XML 元素可以有一个或者多个属性,一旦你已经解析了一个 XML 文档,访问它们就太简单了。

在这部分中,将使用 binary.xml 语法文件,你在上一节中已经看到过了。

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

例 9.24. 访问元素属性

>>> 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__ 特殊方法。它的读者可能乐意接受这一事实:他们不需要理解它是如何工作的就可以有效地使用它。)

例 9.25. 访问单个属性

>>> 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 元素的单个 XML 属性。属性的名称(与你在bitref.attributes NamedNodeMap 的伪目录中寻找的对象同名)保存在a.name中。
2 这个 XML 属性的真实文本值保存在a.value中。
注意
类似于字典,一个 XML 元素的属性没有顺序。属性可以以某种顺序偶然列在最初的 XML 文档中,而在 XML 文档解析为 Python 对象时,Attr 对象以某种顺序偶然列出,这些顺序都是任意的,没有任何特别的含义。你应该总是使用名称来访问单个属性,就像字典的键一样。