Предупреждения «xmlParseEntityRef: no name» при загрузке xml в файл php - PullRequest
78 голосов
/ 30 сентября 2011

Я читаю XML в php, используя simplexml_load_file.Однако при попытке загрузить XML-файл отображается список предупреждений

Warning: simplexml_load_file() [function.simplexml-load-file]: <project orderno="6" campaign_name="International Relief & Development" project in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3

Warning: simplexml_load_file() [function.simplexml-load-file]: ional Relief & Development" project_id="313" client_name="International Relief & in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3    
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3

Как мне исправить это, чтобы удалить эти предупреждения?

(XML сгенерирован из URL http://..../index.php/site/projects и загружен в переменную в test.php. У меня нет прав записи в index.php)

Ответы [ 9 ]

125 голосов
/ 14 января 2013

XML, скорее всего, недействителен.

Проблема может заключаться в том, что "&"

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $text);

избавится от "&" и заменит его версией HTML-кода...попробуй.

62 голосов
/ 24 февраля 2014

нашел это здесь ...

Проблема: Синтаксический анализатор XML возвращает ошибку «xmlParseEntityRef: noname»

Причина: Где-то в тексте XML есть блуждающий символ "&" (символ амперсанда), например. немного текста и немного текста

Решение:

  • Решение 1. Снять амперсанд.
  • Решение 2: закодировать амперсанд (то есть заменить символ «&» на «& amp;»). Не забудьте декодировать при чтении XML текст.
  • Решение 3: Используйте разделы CDATA (текст внутри раздела CDATA будет игнорироваться анализатором.) Например. <! [CDATA [немного текста и еще немного текст]]>

Примечание: ‘&’ ‘<''> all будут вызывать проблемы, если не будут обработаны правильно.

9 голосов
/ 25 июля 2016

Попробуйте сначала очистить HTML, используя эту функцию:

$html = htmlspecialchars($html);

Специальные символы обычно представлены в HTML по-разному, и это может сбить с толку компилятора.Как & становится &amp;.

6 голосов
/ 04 июня 2017

ПРОБЛЕМА

  • Функция PHP simplexml_load_file выдает ошибку синтаксического анализа parser error : xmlParseEntityRef при попытке загрузить файл XML с URL-адреса.

ПРИЧИНА

  • XML, возвращаемый URL-адресом, не является допустимым XML. Содержит значение & вместо &amp;. Вполне возможно, что есть другие ошибки, которые не очевидны в данный момент.

ВЕЩИ НАШЕГО КОНТРОЛЯ

  • В идеале, мы должны убедиться, что в функцию PHP simplexml_load_file передается действительный XML, но похоже, что мы не имеем никакого контроля над тем, как создается XML.
  • Также невозможно заставить simplexml_load_file обработать неверный файл XML. Это не оставляет нам много вариантов, кроме исправление самого файла XML.

ВОЗМОЖНОЕ РЕШЕНИЕ

Преобразование неверного XML в действительный XML. Это можно сделать с помощью PHP tidy extension. Дальнейшие инструкции можно найти по http://php.net/manual/en/book.tidy.php

Если вы уверены, что расширение существует или установлено, выполните следующие действия.

/**
 * As per the question asked, the URL is loaded into a variable first, 
 * which we can assume to be $xml
 */
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<project orderno="6" campaign_name="International Relief & Development for under developed nations">
    <invalid-data>Some other data containing & in it</invalid-data>
    <unclosed-tag>
</project>
XML;

/**
 * Whenever we use tidy it is best to pass some configuration options 
 * similar to $tidyConfig. In this particular case we are making sure that
 * tidy understands that our input and output is XML.
 */
$tidyConfig = array (
    'indent' => true,
    'input-xml' => true, 
    'output-xml' => true,
    'wrap' => 200
);

/**
 * Now we can use tidy to parse the string and then repair it.
 */
$tidy = new tidy;
$tidy->parseString($xml, $tidyConfig, 'utf8');
$tidy->cleanRepair();

/**
 * If we try to output the repaired XML string by echoing $tidy it should look like. 

 <?xml version="1.0" encoding="utf-8"?>
 <project orderno="6" campaign_name="International Relief &amp; Development for under developed nations">
      <invalid-data>Some other data containing &amp; in it</invalid-data>
      <unclosed-tag></unclosed-tag>
 </project> 

 * As you can see that & is now fixed in campaign_name attribute 
 * and also with-in invalid-data element. You can also see that the   
 * <unclosed-tag> which didn't had a close tag, has been fixed too.
 */
echo $tidy;

/**
 * Now when we try to use simplexml_load_string to load the clean XML. When we
 * try to print_r it should look something like below.

 SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [orderno] => 6
            [campaign_name] => International Relief & Development for under developed nations
        )

    [invalid-data] => Some other data containing & in it
    [unclosed-tag] => SimpleXMLElement Object
        (
        )

)

 */
 $simpleXmlElement = simplexml_load_string($tidy);
 print_r($simpleXmlElement);

ВНИМАНИЕ

Разработчик должен попытаться сравнить недопустимый XML с действительным XML (сгенерированным tidy), чтобы убедиться в отсутствии побочных эффектов после использования tidy. Tidy делает очень хорошую работу, делая это правильно, но никогда не помешает увидеть это визуально и быть на 100% уверенным. В нашем случае это должно быть так же просто, как сравнивать $ xml с $ tidy.

6 голосов
/ 28 сентября 2015

Я использую комбинированную версию:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))
6 голосов
/ 01 августа 2013

XML недействителен.

<![CDATA[ 
{INVALID XML}
]]> 

CDATA должен быть обернут вокруг всех специальных символов XML согласно W3C

3 голосов
/ 26 февраля 2014

Это на самом деле из-за того, что персонажи возятся с данными. Использование htmlentities($yourText) работало для меня (у меня был HTML-код внутри XML-документа). Смотри http://uk3.php.net/htmlentities.

0 голосов
/ 07 февраля 2018

Если у вас возникла эта проблема с opencart, попробуйте отредактировать

catalog / controller / extension / feed / google_sitemap.php Для получения дополнительной информации и как это сделать, обратитесь к этому: xmlparseentityref-no-name-error

0 голосов
/ 22 февраля 2017

Это решит мою проблему:

$description = strip_tags($value['Description']);
$description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $description);
$description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description);
$description=str_replace(' & ', ' &amp; ', html_entity_decode((htmlspecialchars_decode($description))));
...