Предупреждения '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. У меня нет написания priveleges для index.php)

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

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

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

будет избавляться от «&» и заменить его на версию HTML-кода … попробуйте.

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

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

Причина. В тексте XML есть символ «&» (символ амперсанда), например. текст и другой текст

Решение:

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

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

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

 $html = htmlspecialchars($html); 

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

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

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

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

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

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

ПРОБЛЕМА

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

ПРИЧИНА

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

ЧТОБЫ ИЗ НАШЕГО КОНТРОЛЯ

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

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

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

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