Не удается разобрать плохо сформированный XML - PullRequest
3 голосов
/ 05 октября 2009

Я пытался разобрать этот канал . Если вы нажмете на эту ссылку, вы заметите, что она не может даже правильно проанализировать ее в браузере.

В любом случае, мой хостинг не позволит мне использовать simplexml_load_file, поэтому я использовал cURL, чтобы получить его, а затем загружать строку в DOM, например:

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

Но я получаю ошибки ("DOMDocument :: loadXML () [domdocument.loadxml]: сущность 'nbsp' не определена в сущности"), затем я попытался использовать SimpleXMLElement без удачи (она показывает ту же ошибку "ошибка парсера: Entity 'nbsp' не определено "и т. д. из-за HTML в этом одном элементе).

$xml = new SimpleXMLElement($rawXML);

Итак, мой вопрос: как мне пропустить / игнорировать / удалить этот элемент, чтобы я мог проанализировать остальные данные?


Редактировать: Спасибо mjv за решение! ... Я только что сделал это (для других, у которых такая же проблема)

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

Ответы [ 2 ]

5 голосов
/ 05 октября 2009

Возможно, вам потребуется манипулировать исходным кодом с помощью чего-то вроде:

$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);
}

Прежде чем передать его в XML-парсер AFAIK, я бы хотел порекомендовать другой способ, но я думаю, что это единственный способ.

Редактировать: Я думаю, что вы можете заменить <description> на <description><![CDATA[ и так далее:

<?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);

Это необходимо сделать для каждого элемента, который содержит символьные данные.

4 голосов
/ 05 октября 2009

Вам может потребоваться ввести шаг предварительного разбора, который бы добавил

<![CDATA[

после каждого тега
и добавить

]]>

перед каждым тегом
В частности, (см. Ответ meder для соответствующего фрагмента PHP)

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

Таким образом, полное содержимое элемента 'decription' будет 'экранировано', поэтому любая html (или даже xhtml) конструкция, найденная в этом элементе и способная генерировать логику синтаксического анализа XML, будет игнорироваться. Это позаботится о & NBSP; проблема, о которой вы упоминаете, но также много других общих проблем.

...