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 对象以某种顺序偶然 列出,这些顺序都是任意的,没有任何特别的含义。你应该总是使用名称来访问单个属性,就像字典的键一样。