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

ここで 2 つのことが間違っています。

  1. Document.getElementById実際に文書内にある要素のみを検索します。ここでは作成しましたbが、実際にはドキュメントに追加していません。(JavaScriptでも全く同じです。)

  2. idを使用して ID 属性としてマークする必要がありますsetIdAttribute。(JavaScript ではこれを行う必要はありません。なぜなら、HTML ドキュメントでは、名前idが付けられた属性は、論理的に十分に ID 属性であると自動的に見なされるからです。しかし、XML はID として名前が付けられた属性を自動的に処理しませid。それらが DTD にあることを明示的に宣言するか、すべての ID 属性に対して個別に呼び出しsetIdAttributeます.また、完全な DOM 実装ではない minidom で DTD が機能するかどうかはわかりません.)

そのようです:

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 に追加すると役立つはずです。たとえば、idすべての要素の id 属性としてevery を設定する<div>場合は、次のように 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 に答える