2009-12-30 16 views

Respuesta

11

No debe instanciar las clases desde minidom directamente. No es una parte compatible de la API, el ownerDocument s no se atará y usted puede obtener algunos comportamientos erróneos extraños. En lugar de utilizar los métodos adecuados DOM Nivel 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' es un comúnmente utilizado, pero mal SystemId Eso URL relativa sólo sería válida dentro de la carpeta xhtml1 en w3.. org.)

Ahora tiene un nodo DocumentType, puede agregarlo a un documento. Según la norma, la única manera garantizada de hacer esto es en el momento de creación de documentos:

>>> 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/> 

Si desea cambiar el tipo de documento de un documento existente, eso es más problemas. El estándar DOM no requiere que los nodos DocumentType sin ownerDocument sean insertables en un documento. Sin embargo, algunos DOM lo permiten, por ej. pxdom. minidom tipo de le permite:

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

pero con errores:

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

cuales pueden o no le importan.

¡Técnicamente, la única manera confiable de establecer un doctype en un documento existente es crear un nuevo documento e importar todo el documento antiguo en él!

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

gracias! No necesito establecer doctype en documento existente, solo en nuevo. – myfreeweb

+0

¡Uf, eso es suerte! :-) – bobince

Cuestiones relacionadas