9.6. 访问元素属性
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 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
    <xml.dom.minidom.NamedNodeMap instance at 0x81e0c9c>
    >>> bitref.attributes.keys()
    [u'id']
    >>> bitref.attributes.values()
    [<xml.dom.minidom.Attr instance at 0x81d5044>]
    >>> bitref.attributes["id"]
    <xml.dom.minidom.Attr instance at 0x81d5044>

| 每个 `Element` 对象都有一个 `attributes` 属性，它是一个 `NamedNodeMap` 对象。听上去挺吓人的，其实不然，因为 `NamedNodeMap` 是一个行为像字典的对象，所以你已经知道怎么使用它了。
| 将 `NamedNodeMap` 视为一个字典，你可以通过 `attributes.keys()` 获得属性名称的一个列表。这个元素只有一个属性，`'id'`。
| 属性名称，像其它 XML 文档中的文本一样，都是以 unicode 保存的。
| 再次将 `NamedNodeMap` 视为一个字典，你可以通过 `attributes.values()` 获取属性值的一个列表。这些值本身是 `Attr` 类型的对象。你将在下一个例子中看到如何获取对象的有用信息。
| 仍然把 `NamedNodeMap` 视为一个字典，你可以通过常用的字典语法和名称访问单个的属性。(那些非常认真的读者将已经知道 `NamedNodeMap` 类是如何实现这一技巧的：通过定义一个 `__getitem__` 专用方法。其它的读者可能乐意接受这一事实：他们不需要理解它是如何工作的就可以有效地使用它。)

### 例 9.25. 访问单个属性

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

| `Attr` 对象完整代表了单个 XML 元素的单个 XML 属性。属性的名称 (与你在 `bitref.attributes` `NamedNodeMap` 伪字典中寻找的对象同名) 保存在`a.name`中。
| 这个 XML 属性的真实文本值保存在 `a.value` 中。

类似于字典，一个 XML 元素的属性没有顺序。属性可以以某种顺序偶然 列在最初的 XML 文档中，而在 XML 文档解析为 Python 对象时，`Attr` 对象以某种顺序偶然 列出，这些顺序都是任意的，没有任何特别的含义。你应该总是使用名称来访问单个属性，就像字典的键一样。