When inserting XML DOM Elements inside existing XML DOM Elements that I loaded from an XML file using the following code, none of my new elements were formatted correctly, they just showed up on one line:
<?php
$dom = DOMDocument::load('file.xml');
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//output: everything looks normal but the new nodes are all on one line.
?>
I found I could pass LIBXML_NOBLANKS to the load method and it would reformat the whole document, including my added stuff:
<?php
$dom = DOMDocument::load('file.xml', LIBXML_NOBLANKS);
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//output: everything looks newly formatted, including new nodes
?>
Hope this helps, took me hours of trial and error to figure this out!
Constantes predefinidas
Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.
- LIBXML_COMPACT (integer)
-
Activa la optimización de asignación de nodos pequeños. Esto puede acelerar
sin la necesidad de cambiar el código.
Note:
Solo disponible en Libxml >= 2.6.21
- LIBXML_DTDATTR (integer)
- Atributos DTD por defecto
- LIBXML_DTDLOAD (integer)
- Carga el subconjunto externo
- LIBXML_DTDVALID (integer)
- Valida con el DTD
- LIBXML_NOBLANKS (integer)
- Elimina nodos en blanco
- LIBXML_NOCDATA (integer)
- Combina CDATA como nodos de texto
- LIBXML_NOEMPTYTAG (integer)
-
Expande etiquetas vacías (por ej. de <br/> a
<br></br>)
Note:
Esta opción está actualmente disponible solo en las funciones DOMDocument::save y DOMDocument::saveXML.
- LIBXML_NOENT (integer)
- Sustituye entidades
- LIBXML_NOERROR (integer)
- Suprime reportes de errores
- LIBXML_NONET (integer)
- Deshabilita el acceso a red cuando se cargan documentos
- LIBXML_NOWARNING (integer)
- Suprime reportes de advertencias
- LIBXML_NOXMLDECL (integer)
-
Omite la declaración XML cuando se guarda un documento
Note:
Solo disponible en Libxml >= 2.6.21
- LIBXML_NSCLEAN (integer)
- Eliminar declaraciones de nombre de espacios redundantes
- LIBXML_PARSEHUGE (integer)
- Setea el flag XML_PARSE_HUGE, que mitiga cualquier límite de codificado del parser.
- LIBXML_XINCLUDE (integer)
- Implementa la sustitución XInclude
- LIBXML_ERR_ERROR (integer)
- Un error recuperable
- LIBXML_ERR_FATAL (integer)
- Un error fatal
- LIBXML_ERR_NONE (integer)
- Sin errores
- LIBXML_ERR_WARNING (integer)
- Una simple advertencia
- LIBXML_VERSION (integer)
- La versión de libxml, como 20605 o 20617
- LIBXML_DOTTED_VERSION (string)
- La versión de libxml, como 2.6.5 o 2.6.17
@oneseventeen
06-Feb-2011 07:51
zachatwork at gmail dot com
10-Feb-2010 07:30
Note: The LIBXML_NOXMLDECL constant is defined in this library but is not supported by DOMDocument (yet).
See also: http://bugs.php.net/bug.php?id=47137
<?php
print "PHP_VERSION: ".PHP_VERSION."\n";
print "LIBXML_VERSION: ".LIBXML_VERSION."\n";
print "LIBXML_NOXMLDECL: ".LIBXML_NOXMLDECL."\n";
$dom = new DomDocument();
$dom->loadXML("<foo />");
# This should work but doesn't.
print "DOMDocument doesn't honor LIBXML_NOXMLDECL:\n";
print $dom->saveXML(null,LIBXML_NOXMLDECL);
# This works, and will still work after the above is fixed.
print "Forwards compatible workaround:\n";
$lines = explode("\n", $dom->saveXML(null, LIBXML_NOXMLDECL), 2);
if(!preg_match('/^\<\?xml/', $lines[0]))
print $lines[0];
print $lines[1];
?>
PHP_VERSION: 5.3.1-0.dotdeb.1
LIBXML_VERSION: 20632
LIBXML_NOXMLDECL: 2
DOMDocument doesn't honor LIBXML_NOXMLDECL:
<?xml version="1.0"?>
<foo/>
Forwards compatible workaround:
<foo/>
