Не может проанализировать плохо сформированный XML

StackOverflow https://stackoverflow.com/questions/1518142

Вопрос

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

В любом случае, моя служба хостинга не позволит мне использовать 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]: Entity 'nbsp' не определен в сущности"), тогда я попытался использовать simplexmlelement без удачи (она показывает ту же ошибку "Ошибка синхронизации: Entity 'nbsp' не определено "и т. Д. ... из -за HTML в этом элементе).

$xml = new SimpleXMLElement($rawXML);

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


РЕДАКТИРОВАТЬ: Спасибо MJV за решение! ... Я только что сделал это (для других, у которых такая же проблема)

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);
Это было полезно?

Решение

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

<![CDATA[

после каждогоu003Cdescription> ярлык
и добавить

]]>

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

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

Таким образом, полное содержание элемента «описания» будет «сбежать», так что любая HTML (или даже XHTML) конструкция, найденная в этом элементе и восприимчивую к выбросу логики диаграммы XML, будет игнорирована. Это позаботится о проблеме, которую вы упоминаете, а также о многих других общих проблемах.

Другие советы

You're probably going to need to manipulate the source code with something like:

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

Before feeding it to an xml parser AFAIK, I'd love to recommend some other way but I think this is the only way.

Edit: I think you can actually replace <description> with <description><![CDATA[ and so forth:

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

You'd need to do this for each element which contains character data.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top