2009-12-28 133 views
1

如何?创建的文档和元素:如何在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') 

我必须做什么?

回答

6

这里有两件事情是错的

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

  2. 您必须使用setIdAttributeid标记为ID属性。 (在JavaScript中不需要这样做,因为在HTML文档中,名称为id的属性自动被认为是ID属性,在逻辑上已经足够了。但是XML自动将作为ID;您可以显式声明它们是在您的DTD或单独致电setIdAttribute每一个ID属性,我不知道该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> 
+1

它在JavaScript中不起作用?那么如何在整个文档中搜索元素 - 包括子节点? – myfreeweb 2009-12-28 20:04:57

+1

编辑了答案,以澄清这与JavaScript有何不同。 – 2009-12-28 20:13:32

+0

document.createElement == minidom.Element和document.appendChild。追加后 ,什么都没有发生,同样的问题。 – myfreeweb 2009-12-28 20:15:21

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