PHP ve HTML html_entity_decode

Ben XML formatında yazılar olsun ve sayfamda onları dahil etmek mediawiki API'sini kullanmaya çalışıyorum. Ben temelde ?action=parse&page=Page_Name&format=xml istekleri kullanarak bir makalenin XML gösterimini alır basit bir kod oluşturulur. Kodu aşağıdaki gibidir:

if($_GET["page"]=='') die("Page not specified (possibly direct call)");
$pagename = $_GET["page"];
$handle = @fopen("mediawiki/api.php?action=parse&page=".$pagename."&format=xml", "r");
if ($handle) {
        while (!feof($handle)) {
        $buffer = $buffer.fgets($handle);
        }       
    $buffer = html_entity_decode($buffer);
    /*
    echo $buffer;
    */
    $xml = simplexml_load_string($buffer);
    foreach($xml->parse->children() as $child){
        switch($child->getName()){
            case "text":
                echo $child->asXML()."<br/>";
                break;
            case "categories":
                echo "<h3>Categories this project is related to: </h3><br/>";
                foreach($child->children() as $grandChild){
                    echo $grandChild." | ";
                }
                break;
        }
    }
    fclose($handle);
}

Şimdi sorun, ben çok garip çıktı alıyorum olmasıdır. Herhangi bir <a name="" href=""></a> <a name="" href=""/>, hangi aşağıdaki tüm metni bir bağlantı (kapanış etiketi </a> olmadığından sanırım) olmak yapar dönüştürülmüş olur. Bu Mozilla Firefox ve Google Chrome hem de görülmektedir. I $buffer = html_entity_decode($buffer);, bu soruna neden şüphelenen ediyorum. html_entity_decode(); bunu önlemek için belirtmeniz gereken bir parametre var mı? Benim kod başka bir hata veya html_entity_decode(); kötüye neden olur?

(Wiki'sinin API XML çıkışını görmek için, farklı page parametreleri ile http://en.wikipedia.org/w/api.php?action=parse&page=No_Such_Page&format=xml deneyebilirsiniz)

OLASI ÇÖZÜM: Ürdün önerildiği gibi, JSON gitmek istemiyordu, bu yüzden bu çözüm ile geldi. Ben sadece html_entity_decode case "text": bloğa taşındı. Yani şimdi ben orada var echo html_entity_decode($child->asXML())."<br/>";. Eğer bu yeterli mümkün olduğunu düşünüyor musunuz?

2 Cevap

Sorun html_entity_decode() ile değildir. Sorun SimpleXML metin yerine XML olarak <text> öğesi içeriğini tedavi olmasıdır. Varsayılan olarak, SimpleXML (<a /> için <a></a>) boş öğeleri sıkıştırır. Bunu aşmanın tek yolu, bir DOM nesnesi haline SimpleXML nesneyi içe, ve ne zaman saving the output LIBXML_NOEMPTYTAG seçeneğini kullanmaktır. Bu seçenek ile sorun herhangi bir <br /> elemanları <br></br> olarak çıktı olmasıdır.

Basit bir alternatif API farklı bir yanıt biçimi kullanmaktır. Ben json tepki biçimini kullanarak önermek ve yanıtı ayrıştırmak için json_decode() işlevini kullanın.

Bu geçerli XML var, tuhaf çıkış değil. Eğer boş bir etiket varsa, XML HTML veya XHTML her zaman geçerli değil kısa bir kapanış sözdizimi kullanmanızı sağlar

<foo></foo>
<foo />

html_entity_decode(); function gibi html varlıkları, dönüştürür

&gt; converts to
>

Sen işlem sonrası xml fragmanı gerekir ve uygun HTML haline dönüştürmek gerekir. Bunu yapmanın en kolay yolu, DomDocument API ile.

$foo = new DomDocument();
$foo->loadHtml('<p> Testing <a href="" /> </p>');	
echo $foo->saveHtml();

Bu bir XML parçası almak ve tüm öz kapanış etiketleri tespit içerir ve HTML belgesi haline dönüştürmek olacaktır. Hala <body/> içinde şeyler ayrıştırmak gerekir, ama hepsi kendini kapanış etiketleri kendiniz tamir çok daha kolay.