Создание XML в PHP с использованием SimpleXML со специальными символами - PullRequest
2 голосов
/ 02 августа 2011

Я работаю над проектом в flex 3, где пользователь вводит некоторый текст, который должен быть сохранен в базе данных mysql и показан позже. Я использую XML для передачи данных с flex на php и наоборот. SimpleXMLElement in php используется для создания XML. Проблема заключается в XML разрывах на специальных символах.

Вот пример кода:

FLEX:

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 ]

3 голосов
/ 02 августа 2011

В XML & запускает сущность. ; заканчивает это. Если у вас есть литерал &, вы получите неопределенную ссылку на сущность . Измените все & на &amp;, которые уже не являются сущностями, например не меняйте &gt; на &amp;gt;. Или поместите некоторые данные в разделы CDATA.

2 голосов
/ 02 августа 2011

Во-первых, если в вашем xml есть свисающий символ &, значит, у вас ошибка синтаксиса xml.Это не имеет ничего общего с SimpleXML или любым другим парсером, жалующимся.Я бы посоветовал вам исправить это еще до того, как данные попадут в базу данных, еще лучше, прежде чем они будут отправлены в службу php.

Предложение Гордона работает, по крайней мере &.Вы, скорее всего, столкнетесь с проблемой с другими персонажами, такими как <, " и т. Д., Позже, и вы столкнетесь с почти такими же вещами.

Я бы предложил вам сделать htmlentities как операция с данными text в стороне xml, not , включая сами теги 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.Это должно эффективно превратить & символов в &amp;, все из них.то есть, это также должно превратить случаи с &gt; в &amp;gt;, так что будьте осторожны с этим.

Дайте мне знать, если вам нужно что-нибудь еще.Кроме того, как дела, чувак !?;)

Edit : О, имейте в виду, с тех пор, как я использовал php, прошло много времени, поэтому некоторая информация, приведенная выше, может быть немного неактуальной.Пожалуйста, поправьте меня, ребята.Спасибо.

1 голос
/ 02 августа 2011

Попробуйте экранировать ваши данные с помощью htmlspecialchars, прежде чем передавать их в SimpleXMLElement :: addChild

...