3

如何?创建了一个文档和一个元素:

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')

我必须做什么?

4

2 回答 2

8

这里有两件事是错误的。

  1. Document.getElementById只会找到文档中实际存在的元素。在这里,您已创建b但并未实际将其添加到文档中。(在 JavaScript 中完全一样。)

  2. 您必须使用 标记id为 ID 属性setIdAttribute。(在 JavaScript 中没有必要这样做,因为在 HTML 文档中id,从逻辑上讲,命名的属性自动被视为 ID 属性。但 XML 不会自动将命名id为 ID 的属性处理;您可以显式声明它们在您的 DTD 中,或者为每个 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>
于 2009-12-28T20:02:00.420 回答
2

将 id 属性的名称添加到 DTD 应该会有所帮助。例如,如果您希望 each 将 id 设置id为所有<div>元素的 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>'
于 2010-06-24T03:38:01.287 回答