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

3 投票
3 回答
10904 浏览
提问于 2025-04-15 17:26

怎么做呢?我创建了一个文档和一个元素:

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

我该怎么办呢?

3 个回答

0

有时候,处理文档中每个元素的最简单方法就是一次性解析整个DOM,像这样:

import xml.dom.minidom as dom
xml = dom.parse("my_file.xml")

# Parse every element and set the ID attribute
for nodes in xml.getElementsByTagName("*"):
    nodes.setIdAttribute("id")

# Now this works (and it is efficient)
test = xml.getElementById("some_id")
2

在文档类型定义(DTD)中添加id属性的名称应该会有所帮助。例如,如果你想让每个<div>元素都使用id作为它的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>'
8

这里有两个问题。

  1. Document.getElementById 只能找到那些实际上在文档中的元素。在这里,你创建了一个 b,但并没有把它添加到文档里。(在 JavaScript 中也是一样的情况。)

  2. 你需要用 setIdAttribute 来标记 id 为一个 ID 属性。(在 JavaScript 中不需要这样做,因为在 HTML 文档中,名为 id 的属性会自动被认为是 ID 属性,这很合逻辑。但在 XML 中,名为 id 的属性并不会自动被当作 ID;你要么在 DTD 中明确声明它们是 ID,要么对每个 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>

撰写回答