Предупреждения 'xmlParseEntityRef: no name' при загрузке xml в файл php

Я читаю 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. У меня нет privleges для записи index.php)

Ответ 1

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

Проблемой может быть "&"

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

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

Ответ 2

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

Проблема: Парсер XML возвращает ошибку "xmlParseEntityRef: noname"

Причина: Существует бродячий '& (символ амперсанда) где-то в тексте XML, например. текст и еще текст

Решение:

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

Примечание: '& "& Л;" ' > ' Все вызовут проблемы, если их не обработать правильно.

Ответ 3

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

$html = htmlspecialchars($html);

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

Ответ 4

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

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))

Ответ 5

Недопустимый XML.

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

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

Ответ 6

ПРОБЛЕМА

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

ПРИЧИНА

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

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

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

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

Преобразовать недопустимый XML в Valid 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), чтобы увидеть, что после использования аккуратных побочных эффектов нет. Тиди делает очень хорошую работу, делая это правильно, но никогда не бывает больно видеть это визуально и быть на 100% уверенным. В нашем случае это должно быть так же просто, как сравнение $xml с $tidy.

Ответ 7

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

Ответ 8

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

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