I had problems to use a DTD from a file. It needed to be resolved relatively and it contained characters that made DomDocument failed to resolve the file.
Encoding and an absolute filename did not help much. So I used the data:// streamwrapper ( http://php.net/manual/en/wrappers.data.php ) as a work-around:
<?php
// relative or absolute filename
$path = '...';
// convert file contents into a filename
$data = file_get_contents($path);
$systemId = 'data://text/plain;base64,'.base64_encode($data);
// ...
// Creates a DOMDocumentType instance
$dtd = $aImp->createDocumentType('qualified name', '', $systemId);
?>
Works like a charm.
DOMImplementation::createDocumentType
(PHP 5)
DOMImplementation::createDocumentType — Crear un objeto DOMDocumentType vacío
Descripción
$qualifiedName = NULL
[, string $publicId = NULL
[, string $systemId = NULL
]]] )Crea un objeto DOMDocumentType vacío. Las declaraciones de entidades y las notaciones no están disponibles. Las expansiones de referencias de entidades y la adición de atributos por defecto no ocurren.
Parámetros
-
qualifiedName -
El nombre cualificado del tipo de documente a crear.
-
publicId -
El identificador público del subconjunto externo.
-
systemId -
El identificador de sistema del subconjunto externo.
Valores devueltos
Un nuevo nodo DOMDocumentType con su
ownerDocument establecido a NULL.
Errores/Excepciones
-
DOM_NAMESPACE_ERR -
Se produce si hay un error con el espacio de nombres, como determina
qualifiedName.
Este método puede ser llamado de forma estática, pero lanzará un error E_STRICT.
Ejemplos
Ejemplo #1 Crear un documento con un DTD adjunto
<?php
// Crear una instancia de la clase DOMImplementation
$imp = new DOMImplementation;
// Crear una instancia de DOMDocumentType
$dtd = $imp->createDocumentType('graph', '', 'graph.dtd');
// Crear una instancia de DOMDocument
$dom = $imp->createDocument("", "", $dtd);
// Establecer otras propiedades
$dom->encoding = 'UTF-8';
$dom->standalone = false;
// Crear un elemento vacío
$element = $dom->createElement('graph');
// Añadir el elemento
$dom->appendChild($element);
// Retrieve and print the document
echo $dom->saveXML();
?>
El resultado del ejemplo sería:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE graph SYSTEM "graph.dtd"> <graph/>
Ver también
- DOMImplementation::createDocument() - Crea un objeto DOMDocument del tipo especificado con su elemento documento
