Tek Tırnaklar ile XML ayrıştırma?

2 Cevap php

I am currently running into a problem where an element is coming back from my xml file with a single quote in it. This is causing xml_parse to break it up into multiple chunks, example: Get Wired, You're Hired! Is then enterpreted as 'Get Wired, You' being one object, the single quote being a second, and 're Hired!' as a third.

Ne yapmak istiyorum:

while($data = fread($fp, 4096)){
    	if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
    		break;
    	}
    }

Ama bu kırılma tutar. Ben Htmlentities yerine bir str_replace çalıştırabilir ve sorun olmadan çalışır, ancak Htmlentities ile istemiyor.

Herhangi bir fikir?

Update: As per JimmyJ's response below, I have attempted the following solution with no luck (FYI there is a response or two above the linked post that update the code that is linked directly):

function XMLEntities($string)
    {
        $string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
        return $string;
    }

    function _privateXMLEntities($num)
    {
    $chars = array(
    	39  => ''',
        128 => '€',
        130 => '‚',
        131 => 'ƒ',
        132 => '„',
        133 => '…',
        134 => '†',
        135 => '‡',
        136 => 'ˆ',
        137 => '‰',
        138 => 'Š',
        139 => '‹',
        140 => 'Œ',
        142 => 'Ž',
        145 => '‘',
        146 => '’',
        147 => '“',
        148 => '”',
        149 => '•',
        150 => '–',
        151 => '—',
        152 => '˜',
        153 => '™',
        154 => 'š',
        155 => '›',
        156 => 'œ',
        158 => 'ž',
        159 => 'Ÿ');
        $num = ord($num);
        return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
    }
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
    		break;
    	}

Update: aşağıda Tom'un söz başı olarak, sihirli tırnak / gerçekten kapalı idi.

Solution: Ne sorunu çözmek için yapıyor sona erdi aşağıdadır:

Tek tek her madde / yazı / vb verileri topladıktan sonra, ben çıkış için daha sonra kullanmak için bir dizi veri, daha sonra toplama sırasında kullanılan yerel değişkenler temizlemek olduğunu saklayın. Ben veri zaten mevcut olup olmadığını denetleyen bir adımda eklenen, ve eğer, ben yerine onu üzerine yazmak yerine, sonuna kadar bağlamak.

So, if I end up with three chunks (as above, let's stick with 'Get Wired, You're Hired!', I will then go from doing $x = 'Get Wired, You' $x = "'" $x = 're Hired!'

To doing: $x = 'Get Wired, You' . "'" . 're Hired!'

Bu en iyi çözüm değil, çalışıyor gibi görünüyor.

2 Cevap

Neden kolayca dosyayı ayrıştırmak için simplexml_load_file gibi bir şey kullanmak değil mi?

Bu etkinleştirildiğinde - Ben sihirli tırnak bazen xml ayrıştırma kutu karmaşa etkin olan düşünüyorsun?. Sen kullanarak zamanında bu devre dışı bırakabilirsiniz

set_magic_quotes_runtime(0);

Edit: kaynak gönderebilir veya almak değilse, bu geçerli olmayabilir, ama yine de garip davranışlara neden olabilir PHP kılavuzda okumak