PHP DOMDocument ile girinti

5 Cevap php

Ben yeni bir XML dosyası oluşturmak için DOMDocument kullanıyorum ve bir insan okuyucu için takip etmek kolay, böylece ben güzel girintili edilecek dosyanın çıkışı için istiyorum.

Örneğin, DOMDocument bu verileri çıktılar zaman:

<?xml version="1.0"?>
<this attr="that"><foo>lkjalksjdlakjdlkasd</foo><foo>lkjlkasjlkajklajslk</foo></this>

Ben XML dosyası olmak istiyorum:

<?xml version="1.0"?>
<this attr="that">
    <foo>lkjalksjdlakjdlkasd</foo>
    <foo>lkjlkasjlkajklajslk</foo>
</this>

Ben cevap arıyor çevresinde arama oldum ve ben buldum her şeyi beyaz boşluk bu şekilde kontrol etmeye söylemek gibi görünüyor:

$foo = new DOMDocument();
$foo->preserveWhiteSpace = false;
$foo->formatOutput = true;

Ama bu hiçbir şey görünmüyor. XML okurken belki de bu sadece çalışır? Ben yeni belgeler yazmaya çalışıyorum aklınızda tutun.

Bunu yapmak için yerleşik DOMDocument bir şey var mı? Ya da bir işlevi kolayca gerçekleştirebilirsiniz?

Çok teşekkürler!

5 Cevap

Bazı John'dan yardım ve kendi başıma etrafında oynadıktan sonra, bu biçimlendirme için bile domBelgesi doğasında destek benim ihtiyaçlarını karşılamak değil gibi görünüyor. Yani, benim kendi girinti fonksiyonunu yazmaya karar verdim.

Bu sadece hızlı bir şekilde birlikte attı oldukça ham fonksiyonudur, yani herkes genel olarak bu konuda söyleyecek herhangi bir optimizasyon ipuçları ya da bir şey varsa, bunu duymak memnun olurdum!

function indent($text)
{
    // Create new lines where necessary
    $find = array('>', '</', "\n\n");
    $replace = array(">\n", "\n</", "\n");
    $text = str_replace($find, $replace, $text);
    $text = trim($text); // for the \n that was added after the final tag

    $text_array = explode("\n", $text);
    $open_tags = 0;
    foreach ($text_array AS $key => $line)
    {
    	if (($key == 0) || ($key == 1)) // The first line shouldn't affect the indentation
    		$tabs = '';
    	else
    	{
    		for ($i = 1; $i <= $open_tags; $i++)
    			$tabs .= "\t";
    	}

    	if ($key != 0)
    	{
    		if ((strpos($line, '</') === false) && (strpos($line, '>') !== false))
    			$open_tags++;
    		else if ($open_tags > 0)
    			$open_tags--;
    	}

    	$new_array[] = $tabs . $line;

    	unset($tabs);
    }
    $indented_text = implode("\n", $new_array);

    return $indented_text;
}

DomDocument de hile yapacak, ben şahsen Googling ve bu anlamaya çalışıyorum saat çift geçirdi ve ben kaydetti kullanmak durumunda

$xmlDoc = new DOMDocument ();
$xmlDoc->loadXML ( $xml );
$xmlDoc->preserveWhiteSpace = false;
$xmlDoc->formatOutput = true;
$xmlDoc->save($xml_file);

Bu sırayla, sadece iş ama, sen aynı kodu kullanabilirsiniz ama bu sıralamada değildir:

$xmlDoc = new DOMDocument ();
$xmlDoc->preserveWhiteSpace = false;
$xmlDoc->formatOutput = true;
$xmlDoc->loadXML ( $xml );
$xmlDoc->save($archivoxml);

Bir cazibe gibi Works, bu yardımcı olur umarım

Ben farklı şekillerde formatOutput ve preserveWhiteSpace ayarını aşağıdaki kodu çalıştırarak denedim, ve çıkışında herhangi bir etkiye sahip tek üyesi formatOutput olduğunu. Aşağıdaki komut dosyasını çalıştırın ve eğer çalışırsa görebilir miyim?

<?php
    echo "<pre>";
    $foo = new DOMDocument();
    //$foo->preserveWhiteSpace = false;
    $foo->formatOutput = true;
    $root = $foo->createElement("root");
    $root->setAttribute("attr", "that");
    $bar = $foo->createElement("bar", "some text in bar");
    $baz = $foo->createElement("baz", "some text in baz");
    $foo->appendChild($root);
    $root->appendChild($bar);
    $root->appendChild($baz);
    echo htmlspecialchars($foo->saveXML());
    echo "</pre>";
?>

Xml yazdırırken Hangi yöntemi diyorsunuz?

Ben bunu kullanın:

$doc = new DOMDocument('1.0', 'utf-8');
$root = $doc->createElement('root');
$doc->appendChild($root);

(...)

$doc->formatOutput = true;
$doc->saveXML($root);

Bu mükemmel çalışıyor ama sadece elemanını yazdıran, böylece elle <?xml ... ?> bölümünü yazdırmak gerekir ..

header("Content-Type: text/xml");

$str = "";
$str .= "<customer>";
$str .= "<offer>";
$str .= "<opened></opened>";
$str .= "<redeemed></redeemed>";
$str .= "</offer>";
echo $str .= "</customer>";

Eğer başka herhangi bir uzantısı kullanıyorsanız .xml ardından ilk başlığını doğru değerine Content-Type başlığı ayarlayın.