Я читаю 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]+;)/', '&', $text);
будет избавляться от «&» и заменить его на версию HTML-кода … попробуйте.
Нашел это здесь …
Проблема. Парсер XML возвращает ошибку «xmlParseEntityRef: noname»
Причина. В тексте XML есть символ «&» (символ амперсанда), например. текст и другой текст
Решение:
- Решение 1. Удалите амперсанд.
- Решение 2. Кодируйте амперсанд (который заменяет символ «&» на «& amp;»). Не забывайте декодировать при чтении XML-текста.
- Решение 3. Используйте секции CDATA (текст внутри секции CDATA будет игнорироваться анализатором.) Например. <! [CDATA [текст и другой текст]]>
Примечание: '&' '<' '>' все вызовут проблемы, если их не обработать правильно.
Сначала попробуйте очистить HTML, используя эту функцию:
$html = htmlspecialchars($html);
Специальные символы обычно представлены по-разному в HTML, и это может смущать компилятор. Подобно &
становится &
,
Я использую комбинированную версию:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
Недопустимый XML.
<![CDATA[ {INVALID XML} ]]>
CDATA должен быть обернут вокруг всех специальных символов XML, как W3C
ПРОБЛЕМА
simplexml_load_file
parser error : xmlParseEntityRef
ошибки parser error : xmlParseEntityRef
при попытке загрузить XML-файл из URL-адреса. ПРИЧИНА
&
value вместо &
, Вполне возможно, что есть и другие ошибки, которые не очевидны на данный момент времени. ЧТОБЫ ИЗ НАШЕГО КОНТРОЛЯ
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 & 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 (сгенерированным аккуратным), чтобы увидеть, что после использования аккуратных побочных эффектов нет. Тиди делает очень хорошую работу, делая это правильно, но никогда не бывает больно видеть это визуально и быть на 100% уверенным. В нашем случае это должно быть так же просто, как сравнение $ xml с $ tidy.
Это происходит из-за того, что персонажи возились с данными. Использование 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))));