Постоянная проблема в течение года, которую я исправил, но превратился в монстра.
Я перемещаю большие объемы данных между сайтами, используя XML, сгенерированный в системах PHP. В основном текст Я столкнулся с некоторыми базовыми элементами XML, которые прервали передачу, поэтому я использовал этот код всех значений XML.
$value=str_replace("'","'",$value);
print '<'.$key.'>';
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>';
Поле $ key является полем, и оно отлично работает для всех данных, за исключением любого текста, содержащего акцент, например, пиньята. Значение с символом ñ отображается как полностью пустое.
Мне еще предстоит найти функцию для очистки текста для форматирования XML с помощью PHP. В настоящее время я выгружаю данные из базы данных в этот формат, затем загружаю в SImpleXML на принимающей стороне, чтобы загрузить обратно в базу данных.
Решение путем очистки всех данных или, возможно, кодировки JSON вместо XML, возможно, будет фантастическим.
Спасибо, Крис
Для моего примера, даже если все мои таблицы установлены в UTF-8, при построении моего XML я должен установить значения в UTF-8
$value=str_replace("'","'",$value);
print '<'.$key.'>';
$value = utf8_encode($value);
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>';
Не уверен, когда кодирование изменяется между чтением из таблицы и размещением, но это дало мне требуемые результаты. Я не думаю, что BASE64 со специальными символами является жизнеспособным.
Если вы используете XML Api (DOM, XMLReader), он позаботится о проблемах кодирования значений / текстового содержимого. Однако имена тегов — это другая проблема. Вам нужно будет создать нормализованное имя тега или использовать фиксированное имя тега. Затем сохраните исходное имя поля в качестве значения атрибута.
Например с фиксированным именем тега field
:
<records>
<record>
<field name="some field">some content</field>
</record>
</records>
Это более чистый вариант, поскольку здесь нет динамических имен тегов, вы можете создать схему / DTD и проверить XML.
Или нормализованная версия имени поля:
<records>
<record>
<some-field>some content</some-field>
</record>
</records>
Это часто используется как общий способ сериализации структуры данных в виде XML. Это только правильно сформированный XML, вы не можете определить схему / XSD, потому что имена тегов зависят от данных.