Ответ 1
XML скорее всего недействителен.
Проблемой может быть "&"
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
избавится от "&" и замените его на него версией HTML-кода... попробуйте.
Я читаю 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)
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
при попытке загрузить XML файл из URL-адреса.ПРИЧИНА
&
вместо &
. Вполне возможно, что есть другие ошибки, которые не очевидны в данный момент времени.ВЕЩИ ИЗ НАШЕГО КОНТРОЛЯ
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 (сгенерированным путем tidy), чтобы увидеть, что после использования аккуратных побочных эффектов нет. Тиди делает очень хорошую работу, делая это правильно, но никогда не бывает больно видеть это визуально и быть на 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))));