2009-12-28 35 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>' 
相關問題