如何使用Python的xml.dom.minidom呈现doctype?

时间:2009-12-30 14:08:28

标签: python xml doctype

我试过了:

document.doctype = xml.dom.minidom.DocumentType('html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"')

输出中没有doctype。如何在不插手的情况下修复?

1 个答案:

答案 0 :(得分:11)

您不应直接从minidom实例化类。它不是API支持的部分,ownerDocument不会占用,你可能会遇到一些奇怪的错误行为。而是使用正确的DOM Level 2 Core方法:

>>> imp= minidom.getDOMImplementation('')
>>> dt= imp.createDocumentType('html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd')

('DTD / xhtml1-strict.dtd'是一个常用但错误的SystemId。该相对URL只能在w3.org的xhtml1文件夹中有效。)

现在您有一个DocumentType节点,您可以将其添加到文档中。根据该标准,唯一有保证的方法是在文档创建时:

>>> doc= imp.createDocument('http://www.w3.org/1999/xhtml', 'html', dt)
>>> print doc.toxml()
<?xml version="1.0" ?><!DOCTYPE html  PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'  'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html/>

如果要更改现有文档的doctype,那就更麻烦了。 DOM标准不要求没有DocumentType的{​​{1}}个节点可插入到文档中。然而,一些DOM允许它,例如。 ownerDocumentpxdom允许它:

minidom

但有错误:

>>> doc= minidom.parseString('<html xmlns="http://www.w3.org/1999/xhtml"><head/><body/></html>')
>>> dt= minidom.getDOMImplementation('').createDocumentType('html', '-//W3C//DTD XHTML 1.0 Strict//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd')
>>> doc.insertBefore(dt, doc.documentElement)
<xml.dom.minidom.DocumentType instance>
>>> print doc.toxml()
<?xml version="1.0" ?><!DOCTYPE html  PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'  'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html xmlns="http://www.w3.org/1999/xhtml"><head/><body/></html>

对你来说可能或不重要。

从技术上讲,在现有文档上设置文档类型的唯一可靠方法是创建一个新文档并将整个旧文档导入其中!

>>> doc.doctype
# None
>>> dt.ownerDocument
# None