DOMDocument fonksiyonları kullanarak işleme önce PHP biçimlendirilmiş XML saptamak

2 Cevap php

Ben harici bir kaynaktan gelen PHP içine bir XML belgeyi yüklemek için gerek duyuyorum. XML, kodlama var ve & gibi yasadışı karakterler içeriyor bildirmiyor. xmlParseEntityRef: no name in Entity ve {[: Ben doğrudan tarayıcıda XML belgeyi yüklemek için çalışırsanız ben PHP dosyayı yüklerken de ben gibi uyarıların çok olsun "geçersiz bir karakter metin içeriğinde bulundu" gibi bir hata alırsınız (2)]}.

Bu XML iyi biçimlendirilmiş olduğu açıktır ve XML kuruluşlara dönüştürülmesi gerekir geçersiz karakterler içeriyor.

XML feed diğer çok sayıda kullanıcı tarafından sağlanan verilerin oluşur ve açıkça doğrulanmadı veya Anladım önce biçimlendirilmemesi değil çünkü bu.

Ben XML besleme tedarikçisi konuştum ve onlar içerik sağlayıcılar dışarı sıralamak için almak için çalışıyoruz söylüyorlar, ama onlar ilk girişini onaylamak gerektiği gibi bu aptalca görünüyor.

Ben temelde herhangi bir kodlama hataları düzelterek ve XML kuruluşlara herhangi bir yasadışı karakter dönüştürme XML düzeltmek gerekir, böylece PHP'nin DOMDocument fonksiyonlarını kullanarak XML yükler sorun.

: Benim kod şu gibi görünüyor

  $feedURL = '3704017_14022010_050004.xml';
  $dom = new DOMDocument();
  $dom->load($feedURL);

Kodlama sorunu gösteren örnek bir XML dosyası (indirmek için tıklayın): feed.xml

XML kurumlara dönüştürülmüş henüz karakter içeriyor Örnek XML:

<?xml version="1.0"?>
<feed>
<RECORD>
<ID>117387</ID>
<ADVERTISERNAME>Test</ADVERTISERNAME>
<AID>10544740</AID>
<NAME>This & This</NAME>
<DESCRIPTION>For one day only this is > than this.</DESCRIPTION>
</RECORD>
</feed>

2 Cevap

Try using the Tidy library which can be used to clean up bad HTML and XML http://php.net/manual/en/book.tidy.php

Bu gibi bazı XML düzeltmek için bir saf PHP çözüm:

<?xml version="1.0"?>
<feed>
<RECORD>
<ID>117387</ID>
<ADVERTISERNAME>Test < texter</ADVERTISERNAME>
<AID>10544740</AID>
<NAME>This & This</NAME>
<DESCRIPTION>For one day only this is > than this.</DESCRIPTION>
</RECORD>
</feed>

Bu gibi bir şey olurdu:

  function cleanupXML($xml) {
    $xmlOut = '';
    $inTag = false;
    $xmlLen = strlen($xml);
    for($i=0; $i < $xmlLen; ++$i) {
        $char = $xml[$i];
        // $nextChar = $xml[$i+1];
        switch ($char) {
        case '<':
          if (!$inTag) {
              // Seek forward for the next tag boundry
              for($j = $i+1; $j < $xmlLen; ++$j) {
                 $nextChar = $xml[$j];
                 switch($nextChar) {
                 case '<':  // Means a < in text
                   $char = htmlentities($char);
                   break 2;
                 case '>':  // Means we are in a tag
                   $inTag = true;
                   break 2;
                 }
              }
          } else {
             $char = htmlentities($char);
          }
          break;
        case '>':
          if (!$inTag) {  // No need to seek ahead here
             $char = htmlentities($char);
          } else {
             $inTag = false;
          }
          break;
        default:
          if (!$inTag) {
             $char = htmlentities($char);
          }
          break;
        }
        $xmlOut .= $char;
    }
    return $xmlOut;
  }

Biz sonra htmlentitiesi kullanarak metin kodlama değil, bir etiketi ya da değil ve eğer olup olmadığını belirterek, basit bir devlet makinesi.

Bu, bir dere eklenti veya bir ön-işlemci olarak yeniden yazmak isteyebilirsiniz böylece bu büyük dosyaları aç bellek olacak fazlalaştı.

Bu sorunu çözmek için, DomDocument yükleme XML Belgesi önce DOĞRU mal kurtarmak ayarlayın

$doc->recover = TRUE

Bu kodu deneyin:

$feedURL = '3704017_14022010_050004.xml';
$dom = new DOMDocument();
$doc->recover = TRUE;
$dom->load($feedURL);

http://www.php.net/manual/en/class.domdocument.php#domdocument.props.recover