За последнее время я наткнулся на довольно много генераторов XML-фидов, написанных на PHP, с разной степенью «правильности». Несмотря на то, что генерирование XML должно быть очень простым, все еще есть немало подводных камней, о которых я чувствую каждый PHP или (вставьте свой язык) разработчик должен знать.
1. Вам лучше использовать библиотеку XML
Это первое и главное правило. Большинство людей в конечном итоге генерируют свои xml, используя простую конкатенацию строк, в то время как существует множество специализированных инструментов, которые действительно помогут вам создать свой собственный XML.
В PHP земле лучшим примером является XMLWriter. На самом деле это довольно легко использовать:
<?php
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
$xmlWriter->startDocument('1.0','UTF-8');
$xmlWriter->startElement('root');
$xmlWriter->text('Contents of the root tag');
$xmlWriter->endElement(); // root
$xmlWriter->endDocument();
echo $xmlWriter->outputMemory();
?>
Конечно, XMLWriter является многословным, но вам нужно меньше беспокоиться о том, как избежать и проверить ваши XML-документы.
2. Понять Unicode
Знаете ли вы разницу между байтом, символом и кодовой точкой? Если вы этого не сделаете, я бы, наверное, дважды подумал о найме вас. Это просто шокирует, как много программистов, которые не понимают основ юникода, UTF-8 и как это связано с сетью.
Часто встречающееся оправдание отсутствия необходимости заботиться о персонажах, не относящихся к ascii, таких как люди в англоязычных странах. Однако, если вам нужно использовать знак евро (€) или вы имеете дело с людьми, копирующими текстовые документы, вы наверняка столкнетесь с проблемами.
Простого вызова utf8_encode на самом деле недостаточно. Если некоторые ваши исходные данные уже были закодированы как UTF-8, вы потеряете данные. Используйте utf8_encode, только если вы знаете, что ваши исходные данные закодированы как ISO-8859-1.
Единственный верный способ сделать это — убедиться, что каждый шаг вашего веб-приложения — это UTF-8. Включая ваш тип содержимого HTTP / HTML, базу данных MySQL и все, что в основном принимает данные для вашего приложения (электронная почта, импортеры CSV, программы чтения XML, веб-сервисы). Как только вы абсолютно уверены, что каждая часть в вашем приложении — UTF-8, и преобразованные все старые данные начнут работать правильно.
3. CDATA никогда не бывает решением
Может быть заманчиво решить любые проблемы с кодировкой, просто окружив его <! [CDATA [ and ]]> . Это может гарантировать, что анализаторы XML не выдают ошибку при чтении, но у них все еще есть «неправильные» символы. Если ваш XML-документ имеет теги CDATA или вы считаете, что вам нужен CDATA, вы, вероятно, ошибаетесь.
Чаще всего использование CDATA фактически связано с проблемами кодирования (см. Раздел 2). CDATA не является методом для кодирования двоичных символов, парсеры xml будут по-прежнему выдавать ошибки, если они встречают определенные последовательности байтов. Если вам действительно необходимо кодировать двоичные данные в XML, лучше всего использовать вместо этого что-то вроде base64_encode .
Если ваш XML-канал использует CDATA из-за проблем с кодированием, вы фактически переносите свою проблему на потребителя вашего XML-канала. Таким образом, вместо того, чтобы видеть «странные символы» на вашей стороне, у человека, который читает ваш XML-канал, теперь нет хорошего способа определить, какая кодировка действительно использовалась. Например, если вы генерируете RSS-канал, это может привести к тому, что читатели RSS будут выдавать ошибки или неправильно отображать символы.
4. Будьте либеральны с пробелами
Ошибка типа «неожиданный символ в строке 1, столбец 176456» гораздо сложнее отладить, чем «строка 5078, столбец 24». Пробелы между тегами xml обычно не имеют никакого значения, поэтому вы можете добавить столько отступов и разрывов строк (\ n), сколько захотите. Обратите внимание, что такие инструменты, как XMLWriter, автоматически сделают отступ для вас.
5. Будьте многословны
Даже если вы легко поймете, что <ORD_NR> означает «номер заказа», нет никаких причин, по которым вам не следует указывать его как «номер заказа». Обратите внимание, что следующие правила оказываются в пользу большинства людей:
- Используйте строчные буквы для тегов и имен атрибутов.
- Используйте тире (-) для разделения слов, а не подчеркивания (_).
- Минимизируйте использование атрибутов, вложенные теги обеспечивают большую гибкость.
6. Будьте осторожны с сущностями
Единственными допустимыми объектами в XML являются & lt; (<), & gt; (>) & amp; (&) и & quot; («), поэтому любая другая сущность просто не будет работать и выбрасывать ошибки.
HTML DTD добавляет много сущностей, поэтому, если вы в основном привыкли использовать HTML, вы можете ожидать, что другие сущности будут работать. Если в ваших исходных данных уже есть сущности, вам, возможно, придется сначала избавиться от них.
В PHP это означает, что вы должны использовать htmlspecialchars вместо htmlentities .
Не стесняйтесь обсуждать, не соглашаться или добавлять в этот список в комментариях, я рад услышать ваш опыт.