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!
Öntanımlı Sabitler
Buradaki sabitler bu eklenti için tanımlanmış olup, sadece eklentinin PHP içinde derlenmiş olması veya çalışma anında devingen olarak yüklenmesi halinde kullanılabilir.
-
LIBXML_COMPACT(integer) -
Küçük düğüm ayırma en iyilemesini etkinleştirir. Kodda değişiklik
yapmaksızın uygulamanızın hızlanmasını sağlar.
Bilginize:
Sadece Libxml >= 2.6.21 sürümlerinde kullanılabilmektedir.
-
LIBXML_DTDATTR(integer) - Öntanımlı DTD öznitelikleri.
-
LIBXML_DTDLOAD(integer) - Harici alt kümeyi yükler.
-
LIBXML_DTDVALID(integer) - DTD ile doğrulama yapar.
-
LIBXML_NOBLANKS(integer) - Boş düğümleri siler.
-
LIBXML_NOCDATA(integer) - CDATA bölümleri metin düğümü olarak ele alınır.
-
LIBXML_NOEMPTYTAG(integer) -
Boş etiketleri genişletir (örneğin, <br/> etiketi
<br></br> haline getirilir).
Bilginize:
Bu seçenek şimdilik sadece DOMDocument::save() ve DOMDocument::saveXML() yönteminde kullanılabilmektedir.
-
LIBXML_NOENT(integer) - Öğe ikameleri yapılır.
-
LIBXML_NOERROR(integer) - Hata raporlama kapatılır.
-
LIBXML_NONET(integer) - Belgeler yüklenirken ağ erişimi iptal edilir.
-
LIBXML_NOWARNING(integer) - Uyarı raporlama kapatılır.
-
LIBXML_NOXMLDECL(integer) -
Bir belgeyi kaydederken XML bildirimi atlanır.
Bilginize:
Sadece Libxml >= 2.6.21 sürümlerinde kullanılabilmektedir.
-
LIBXML_NSCLEAN(integer) - Gereksiz isim alanı bildirimleri silinir.
-
LIBXML_XINCLUDE(integer) - XInclude ikamesi gerçeklenir.
-
LIBXML_ERR_ERROR(integer) - Kurtarılabilir hata.
-
LIBXML_ERR_FATAL(integer) - Ölümcül hata.
-
LIBXML_ERR_NONE(integer) - Hata yok.
-
LIBXML_ERR_WARNING(integer) - Basit uyarı.
-
LIBXML_VERSION(integer) - 20605 veya 20617 biçiminde libxml sürümü.
-
LIBXML_DOTTED_VERSION(string) - 2.6.5 veya 2.6.17 biçiminde libxml sürümü.
@oneseventeen
05-Feb-2011 04:51
zachatwork at gmail dot com
09-Feb-2010 04: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/>
