Создание XML в PHP с использованием SimpleXML со специальными символами
Я работаю над проектом в flex 3
, где пользователь вводит некоторый текст, который должен быть сохранен в базе данных mysql
и показан позже. Я использую XML
для передачи данных с flex на php и наоборот. SimpleXMLElement
в php
используется для создания XML
. Проблема заключается в XML
разрывах на специальных символах.
Вот пример кода:
ГИБКИЙ:
var someXML:XML = <root><data>somedata</data><data>...</data> ... </root>
var data:Object = {};
data.xmlData = someXML;
saveDataService.send(data);
Здесь somedata
- данные, введенные пользователем. В php
я извлекаю someXML
с помощью SimpleXMLElement
и сохраняю его в mysql
. Там до сих пор это не проблема. Даже если somedata
содержит специальные символы, он работает нормально, и данные хранятся правильно.
Теперь, в другом случае, при получении данных из базы данных и отображении в flex, ответ php прерывается с ошибкой:
Элемент SimpleXMLElement::addChild() [элемент simplexmlelement.addchild]: незавершенная ссылка на сущность
Я пытался использовать urlencode
в php и decodeURI
функцию в flex, но декодированная строка не та же самая, несколько специальных символы все еще %xy
после декодирования.
Как мне решить эту проблему?
3 answers
Во-первых, если у вас есть висячий символ &
в вашем xml, то у вас ошибка синтаксиса xml. Это не имеет ничего общего с жалобами SimpleXML или любого другого анализатора. Я бы посоветовал вам исправить это еще до того, как данные попадут в базу данных, а еще лучше, до того, как они будут отправлены в службу php.
Предложение Гордона работает, по крайней мере, для &
. Скорее всего, вы столкнетесь с проблемой с другими персонажами, такими как <
, "
и т.д., Позже, и вы столкнетесь почти с тем же самым вещь.
Я бы предложил вам выполнить htmlentities
аналогичную операцию с текстовыми данными в xml, не , включая сами теги xml. Следующий код взят из http://thingsthatwork.net/index.php/2008/06/26/html-entities-and-actionscript/
XML(new XMLNode(XMLNodeType.TEXT_NODE, "content with special chars like & and others")).toXMLString();
Не проверял вышеизложенное, но оно должно вернуть вам очищенное содержимое, которое вы можете поместить в xml. Он должен эффективно превращать символы &
в &
, все из них. т. Е. Это также должно превратите случаи >
в &gt;
, так что будьте осторожны с этим.
Дайте мне знать, если вам понадобится что-нибудь еще. Кроме того, как у тебя дела, чувак!?;)
Редактировать: О, имейте в виду, прошло много времени с тех пор, как я использовал php, поэтому некоторые из приведенных выше сведений могут быть немного неточными. Пожалуйста, поправьте меня, ребята. Спасибо.
В XML &
запускает сущность. ;
заканчивает его. Когда у вас есть литерал &
, вы получите нераскрытую ссылку на сущность. Измените все &
на &
, которые еще не являются сущностями, например, не меняйте >
на &gt;
. Или поместите некоторые данные в разделы CDATA.
Попробуйте экранировать свои данные с помощью htmlspecialchars, прежде чем передавать их в SimpleXMLElement::addChild