Как отобразить документ с Xml.dom.dom.dom.dom.dom.dom.dom.dom.minidom?

StackOverflow https://stackoverflow.com/questions/1980380

  •  22-09-2019
  •  | 
  •  

Вопрос

Я старался:

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

В выводе нет документации. Как исправить, не вставляя его вручную?

Это было полезно?

Решение

Вы не должны создавать экземпляры классов из minidom напрямую. Это не поддерживаемая часть API, ownerDocumentS не свяжет, и вы можете получить странные неправильные поведения. Вместо этого используйте правильные методы ядра уровня 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top