如何在Python xml.dom.minidom中设置元素的id?

时间:2009-12-28 19:48:30

标签: python xml dom minidom

怎么样?创建了一个文档和一个元素:

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

我必须做什么?

2 个答案:

答案 0 :(得分:6)

这里有两件事是错误的。

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

  2. 您必须使用idsetIdAttribute标记为ID属性。 (没有必要在JavaScript中执行此操作,因为在HTML文档中,名为id的属性在逻辑上足以自动被视为ID属性。但XML 会自动处理名为{{1的属性作为ID;您可以显式声明它们在您的DTD中,也可以为每个ID属性单独调用id。我不确定DTD是否适用于minidom,这不是一个完整的DOM实现。 )

  3. 像这样:

    setIdAttribute

    之后,import xml.dom.minidom as d a = d.Document() b = a.createElement('test') a.appendChild(b) b.setAttribute('id', 'x') b.setIdAttribute('id') 有效:

    getElementById

答案 1 :(得分:2)

将id属性的名称添加到DTD应该会有所帮助。例如,如果您希望每个人都将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>'