Как отобразить документ с Xml.dom.dom.dom.dom.dom.dom.dom.dom.minidom?
Вопрос
Я старался:
document.doctype = xml.dom.minidom.DocumentType('html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"')
В выводе нет документации. Как исправить, не вставляя его вручную?
Решение
Вы не должны создавать экземпляры классов из minidom
напрямую. Это не поддерживаемая часть API, ownerDocument
S не свяжет, и вы можете получить странные неправильные поведения. Вместо этого используйте правильные методы ядра уровня 2 DOM:
>>> 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 будет действительным только в папке XHTML1 в W3.org.)
Теперь у вас есть 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
быть вставленными в документ. Однако некоторые домики позволяют это, например. 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
что может или не может иметь значение для вас.
Технически, единственным надежным способом в соответствии с стандартом для установки Doctype на существующем документе является создание нового документа и импортировать весь старый документ в него!
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