ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 9.6. 访问元素属性 XML 元素可以有一个或者多个属性,只要已经解析了一个 XML 文档,访问它们就太简单了。 在这部分中,将使用 `binary.xml` 语法文件,你在[上一节](searching.html "9.5. 搜索元素")中已经看到过了。 > 注意 > 这部分由于某个含义重叠的术语可能让人有点糊涂。在一个 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> ``` | | | | --- | --- | | \[1\] | 每个 `Element` 对象都有一个 `attributes` 属性,它是一个 `NamedNodeMap` 对象。听上去挺吓人的,其实不然,因为 `NamedNodeMap` 是一个[行为像字典](../object_oriented_framework/userdict.html "5.5. 探索 UserDict:一个封装类")的对象,所以你已经知道怎么使用它了。 | | \[2\] | 将 `NamedNodeMap` 视为一个字典,你可以通过 `attributes.keys()` 获得属性名称的一个列表。这个元素只有一个属性,`'id'`。 | | \[3\] | 属性名称,像其它 XML 文档中的文本一样,都是以 [unicode](unicode.html "9.4. Unicode") 保存的。 | | \[4\] | 再次将 `NamedNodeMap` 视为一个字典,你可以通过 `attributes.values()` 获取属性值的一个列表。这些值本身是 `Attr` 类型的对象。你将在下一个例子中看到如何获取对象的有用信息。 | | \[5\] | 仍然把 `NamedNodeMap` 视为一个字典,你可以通过常用的字典语法和名称访问单个的属性。(那些非常认真的读者将已经知道 `NamedNodeMap` 类是如何实现这一技巧的:通过定义一个 [`__getitem__` 专用方法](../object_oriented_framework/special_class_methods.html "5.6. 专用类方法")。其它的读者可能乐意接受这一事实:他们不需要理解它是如何工作的就可以有效地使用它。) | ## 例 9.25. 访问单个属性 ``` >>> a = bitref.attributes["id"] >>> a <xml.dom.minidom.Attr instance at 0x81d5044> >>> a.name u'id' >>> a.value u'bit' ``` | | | | --- | --- | | \[1\] | `Attr` 对象完整代表了单个 XML 元素的单个 XML 属性。属性的名称 (与你在 `bitref.attributes` `NamedNodeMap` 伪字典中寻找的对象同名) 保存在`a.name`中。 | | \[2\] | 这个 XML 属性的真实文本值保存在 `a.value` 中。 | > 注意 > 类似于字典,一个 XML 元素的属性没有顺序。属性可以以某种顺序_偶然_ 列在最初的 XML 文档中,而在 XML 文档解析为 Python 对象时,`Attr` 对象以某种顺序_偶然_ 列出,这些顺序都是任意的,没有任何特别的含义。你应该总是使用名称来访问单个属性,就像字典的键一样。