2009-12-30 80 views

回答

11

您不應直接從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允許它,例如。 pxdomminidom一種允許它:

>>> 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 
+0

謝謝!我不需要在現有文檔上設置文檔類型,只需新建文檔。 – myfreeweb

+0

唷,那很幸運! :-) – bobince