Я читаю 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)
@
перед нимsimplexml_load_file
или добавив флаг, см.simplexml_load_file
Дополнительную информацию на странице руководства или удалите свой вопрос, это дубликат.Ответы:
Скорее всего, XML неверен.
Проблема могла быть в "&"
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
избавится от символа «&» и заменит его версией кода HTML ... попробуйте.
источник
$text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&', $text);
Нашел здесь ...
источник
Попробуйте сначала очистить HTML с помощью этой функции:
$html = htmlspecialchars($html);
Специальные символы обычно представлены в HTML по-разному, и это может сбивать с толку компилятор. Вроде
&
становится&
.источник
htmlspecialchars()
- это точная функция для преобразования&, ", <, >
символов в данных элемента.htmlspecialchars()
XML и не нарушать его. Я попробовал несколько флагов, но мой XML все равно сломался.htmlspecialchars
содержимое тега xml, а не весь XMLИспользую комбинированный вариант:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
источник
simplexml_load_file
выдает ошибку синтаксического анализаparser error : xmlParseEntityRef
при попытке загрузить файл XML с URL-адреса.&
значение вместо&
. Вполне возможно, что есть и другие ошибки, которые на данный момент не очевидны.simplexml_load_file
функцию PHP подается действительный 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 & Development for under developed nations"> <invalid-data>Some other data containing & 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.
источник
XML недействителен.
CDATA должен быть обернут вокруг всех специальных символов XML, согласно W3C.
источник
На самом деле это происходит из-за того, что персонажи возятся с данными. Использование
htmlentities($yourText)
сработало для меня (у меня был код HTML внутри документа xml). См. Http://uk3.php.net/htmlentities .источник
Это решает мою проблему:
$description = strip_tags($value['Description']); $description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $description); $description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description); $description=str_replace(' & ', ' & ', html_entity_decode((htmlspecialchars_decode($description))));
источник
Если у вас возникла эта проблема с opencart, попробуйте отредактировать
источник