如何在Python的xml.dom.minidom中设置元素的id?
怎么做呢?我创建了一个文档和一个元素:
import xml.dom.minidom as d
a=d.Document()
b=a.createElement('test')
setIdAttribute这个方法不管用 :(
b.setIdAttribute('something')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/xml/dom/minidom.py", line 835, in setIdAttribute
self.setIdAttributeNode(idAttr)
File "/usr/lib/python2.6/xml/dom/minidom.py", line 843, in setIdAttributeNode
raise xml.dom.NotFoundErr()
xml.dom.NotFoundErr
而且如果我手动设置这个,getElementById就找不到它。
b.setAttribute('id', 'something')
a.getElementById('something')
我该怎么办呢?
3 个回答
0
有时候,处理文档中每个元素的最简单方法就是一次性解析整个DOM,像这样:
import xml.dom.minidom as dom
xml = dom.parse("my_file.xml")
# Parse every element and set the ID attribute
for nodes in xml.getElementsByTagName("*"):
nodes.setIdAttribute("id")
# Now this works (and it is efficient)
test = xml.getElementById("some_id")
2
在文档类型定义(DTD)中添加id属性的名称应该会有所帮助。例如,如果你想让每个<div>
元素都使用id
作为它的id属性,你可以这样设置你的DTD:
<!DOCTYPE div [<!ATTLIST div id ID #IMPLIED>]>
下面是一个可用的示例:
>>> from xml.dom.minidom import parse, parseString
>>> data='<!DOCTYPE div [<!ATTLIST div id ID #IMPLIED>]><div><div id="foo">FOO word</div><div id="bar">BAR word</div></div>'
>>> x=parseString(data)
>>> x.getElementById('foo')
<DOM Element: div at 0x1126440>
>>> x.getElementById('foo').toxml()
u'<div id="foo">FOO word</div>'
8
这里有两个问题。
Document.getElementById
只能找到那些实际上在文档中的元素。在这里,你创建了一个b
,但并没有把它添加到文档里。(在 JavaScript 中也是一样的情况。)你需要用
setIdAttribute
来标记id
为一个 ID 属性。(在 JavaScript 中不需要这样做,因为在 HTML 文档中,名为id
的属性会自动被认为是 ID 属性,这很合逻辑。但在 XML 中,名为id
的属性并不会自动被当作 ID;你要么在 DTD 中明确声明它们是 ID,要么对每个 ID 属性单独调用setIdAttribute
。而且我不确定 DTD 的方法是否适用于 minidom,因为它并不是一个完整的 DOM 实现。)
像这样:
import xml.dom.minidom as d
a = d.Document()
b = a.createElement('test')
a.appendChild(b)
b.setAttribute('id', 'x')
b.setIdAttribute('id')
之后,getElementById
就可以正常工作了:
>>> a.getElementById('x')
<DOM Element: test at 0xb77712ec>