Не может проанализировать плохо сформированный XML
-
19-09-2019 - |
Вопрос
Я пытался проанализировать это корм. Анкет Если вы нажмете на эту ссылку, вы заметите, что она даже не может правильно разобрать в браузере.
В любом случае, моя служба хостинга не позволит мне использовать 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 /> blah, blah...</description>
should become
<description><![CDATA[blah <br /> 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', $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.