PHP - DOM sınıfı - sayılı kişiler ve kodlamaları sorun

2 Cevap php

Ben PHP DOM sınıfı ile bazı zveya yaşıyveyaum.

Ben bir sitemap script yapıyveyaum, ve ben gibi olmak $ doc-> SaveXML çıkışını () gerekir

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <url>
        <loc>http://www.somesite.com/servi&#xE7;os/redesign</loc>
    </url>
</root>

veya

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <url>
        <loc>http://www.somesite.com/servi&#231;os/redesign</loc>
    </url>
</root>

ama ben alıyorum:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <url>
        <loc>http://www.somesite.com/servi&amp;#xE7;os/redesign</loc>
    </url>
</root>

Bu bir numaralı kişilere adlandırılmış yerine işlevini kullanarak, ben alabilir dolaba.

Ben de yeniden başardı

<?xml version="1.0" ?>
<root>
    <url>
        <loc>http://www.somesite.com/servi&amp;#xE7;os/redesign</loc>
    </url>
</root>

Ancak belirtilen kodlama olmadan.

En iyi çözüm (ben kodu yazılması gerektiğini düşünüyorum yolu) olacaktır:

<?php
$myArray = array();
// do some stuff to populate the with URL strings

$doc = new DOMDocument('1.0', 'UTF-8');

// here we modify some property. Maybe is the answer I am looking fveya...

$urlset = doc->createElement("urlset");
$urlset = $doc->appendChild($urlset);

fveyaeach($myArray as $address) {
    $url = $doc->createElement("url");
    $url = $urlset->appendChild($url);

    $loc = $doc->createElement("loc");
    $loc = $url->appendChild($loc);

    $valueContent = $doc->createTextNode($value);
    $valueContent = $loc->appendChild($address);
}

echo $doc->saveXML();
?>

Notlar:

  • Sunucu yanıtı başlığı UTF-8 gibi karakter kümesini içerir;
  • PHP komut dosyası UTF-8 kaydedilir;
  • URL'leri UTF-8 dizeleri okumak;
  • Above script contains encoding declaration on DOMDocument constructveya, and does not use any convert functions, like htmlentities, urlencode, utf8_encode...

I've tried changing the DOMDocument properties DOMDocument::$resolveExternals and DOMDocument::$substituteEntities values. None combinations wveyaked.

And yes, I know I can made all process without specifying the character set on DOMDocument constructveya, dump string content into a variable and make a very simple string substitution with string replace functions. This wveyaks. But I would like to know where I am slipping, how can this be made using native API's and settings, veya even if this is possible.

Şimdiden teşekkürler.

2 Cevap

resolveExternals ve substituteEntities ayrıştırıcı özellikleridir. Onlar serileştirme üzerinde bir etkisi yoktur.

XML infoset arasında herhangi bir ayrım yapmaz:

<loc>http://www.somesite.com/serviços/redesign</loc>
<loc>http://www.somesite.com/servi&#xE7;os/redesign</loc>
<loc>http://www.somesite.com/servi&#231;os/redesign</loc>

hepsi herhangi bir XML ayrıştırıcı gibi aynı onları tedavi gerekir, tam olarak aynı bilgileri temsil eden, ve XML serializers genellikle çıkış için hangi seçim izin vermeyin. Normalde sadece ç dahildir ve SERIALISER çıktı ham UTF-8 bayt dize olarak, ç bunu yazalım için metin düğümün değerini ayarlamanız gerekir.

Eğer gerçekten sadece ASCII içeren bir XML dosyası oluşturmak gerekir, bu yüzden sizin gibi karakterler kullanamazsınız ç, daha sonra doğrudan belge kodlaması olarak ASCII kullanmak için PHP söyle:

$s= "serviços"; // or "\xC3\xA7" if you can't input UTF-8 strings directly

$doc = new DOMDocument('1.0', 'US-ASCII');
$doc->appendChild($loc= $doc->createElement('loc'));
$loc->appendChild($doc->createTextNode($s));
echo $doc->saveXML();

sonuç:

<?xml version="1.0" encoding="US-ASCII"?>
<loc>servi&#231;os</loc>

Ancak ... tüm bu having, ben hala bu doğru olduğunu sanmıyorum. Sizin değer bir URL gibi görünüyor, ve non-ASCII karakterleri ne olursa olsun içeren XML olarak kodlanmış konum nasıl URL'ler geçerli değildir. Bu olmalıdır:

http://www.somesite.com/servi%C3%A7os/redesign

yani. rawurlencode('serviços').

CreateTextNode geçirmeden önce varlıkları Decode

$valueContent = $doc->createTextNode(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));

Çünkü o ç UTF-8 belgede geçerli bir varlık değildir. Yani DomDocument & görür ve & olarak kodlar