6
我想:如何使用Python的xml.dom.minidom呈現文檔類型?
document.doctype = xml.dom.minidom.DocumentType('html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"')
有輸出沒有DOCTYPE。如何修復而無需手動插入?
我想:如何使用Python的xml.dom.minidom呈現文檔類型?
document.doctype = xml.dom.minidom.DocumentType('html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"')
有輸出沒有DOCTYPE。如何修復而無需手動插入?
您不應直接從minidom
實例化類。它不是API的支持部分,ownerDocument
s不會捆綁,你可以得到一些奇怪的misbehaviours。相反,使用正確的DOM 2級核心方法:
>>> 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的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/>
如果你想改變現有文檔的文檔類型,這是比較麻煩。 DOM標準不要求DocumentType
節點沒有ownerDocument
可插入到文檔中。但是有些DOM允許它,例如。 pxdom
。 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
這可能會或可能不會怎麼了你。
從技術上講,在現有文檔上設置文檔類型的唯一可靠方法是創建一個新文檔並將整個舊文檔導入它!
def setDoctype(document, doctype):
imp= document.implementation
newdocument= imp.createDocument(doctype.namespaceURI, doctype.name, doctype)
newdocument.xmlVersion= document.xmlVersion
refel= newdocument.documentElement
for child in document.childNodes:
if child.nodeType==child.ELEMENT_NODE:
newdocument.replaceChild(
newdocument.importNode(child, True), newdocument.documentElement
)
refel= None
elif child.nodeType!=child.DOCUMENT_TYPE_NODE:
newdocument.insertBefore(newdocument.importNode(child, True), refel)
return newdocument
謝謝!我不需要在現有文檔上設置文檔類型,只需新建文檔。 – myfreeweb
唷,那很幸運! :-) – bobince