Kötü biçimli XML ayrıştırmak olamaz

2 Cevap php

I this feed ayrıştırmak çalışıyorum. Eğer bu linke tıklarsanız, hatta tarayıcıda doğru ayrıştırmak değil fark edeceksiniz.

Her neyse, benim barındırma hizmeti bana simplexml_load_file kullanmanıza izin vermez, bu yüzden sonra bu gibi DOM'ye dize yükleme almak için cURL kullanarak oldum:

$dom = new DOMDocument;
$dom->loadXML($rawXML);
if (!$dom) {
 echo 'Error while parsing the document';
 exit;
}
$xml = simplexml_import_dom($dom);

Ama hataları alıyorum ("DOMDocument :: loadXML () [domdocument.loadxml]: Varlık 'nbsp' Varlık içinde tanımlı değil"), sonra (aynı hata "Ayrıştırıcı hata gösterir şans olmadan SimpleXMLElement kullanarak çalıştı: İdarenin nbsp ' çünkü) o tek eleman HTML vb .., "tanımlı değil.

$xml = new SimpleXMLElement($rawXML);

Yani benim soru verilerin geri kalanını ayrıştırmak böylece nasıl kaldırmak / / ignore o öğeyi atlamak mı, nedir?


Edit: teşekkürler çözüm için MJV ... Ben sadece (aynı sorun var diğerleri için) yaptım

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);

2 Cevap

Sen eklersiniz bir ön-ayrıştırma adım tanıtmak gerekebilir

<![CDATA[

after each <description> tag
and add

]]>

before each </description> tag
Specifically, (see meder's response for corresponding PHP snippet)

<description>blah <br />&nbsp; blah, blah...</description>
should become
<description><![CDATA[blah <br />&nbsp; blah, blah...]]></description>

Bu şekilde, 'decription' öğesinin tam bir içerik herhangi bir html (hatta xhtml) inşa bu eleman bulunan ve XML ayrıştırma mantığı atma duyarlı göz ardı edileceği, böylece 'kaçtı' olacaktır. Bu dikkat cekti sorun söz değil, aynı zamanda diğer birçok ortak konular.

Muhtemelen gibi bir şey ile kaynak kodu işlemek için ihtiyacımız olacak:

$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
if ( $xml ) {
    $xml = preg_replace( '/&nbsp/', '&amp;nbsp', $xml );
    $xml = new SimpleXMLElement($xml);
    var_dump($xml);
}

Bir xml ayrıştırıcı afaik onu beslemeden önce, ben başka bir yol tavsiye etmek isterdim ama bu tek yol olduğunu düşünüyorum.

Düzenleme: Ben aslında <description><![CDATA[ ve benzeri ile <description> olarak değiştirin düşünüyorum:

<?php
$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
$xml = preg_replace( '/<description>/', '<description><![CDATA[', $xml );
$xml = preg_replace( '/<\/description>/', ']]></description>', $xml );
$xml = new SimpleXMLElement($xml);
var_dump($xml);

Sen karakter verileri içeren her element için bunu yapmak gerekiyordu.