PHP

Генерация XML в PHP

Рассматривая примеры генерации XML-выгрузок от различных украинских маркетов (не буду никого смущать прямыми ссылками), удивлен тем, что многие используют обыкновенную шаблонную методику, вроде:

Рассматривая примеры генерации XML-выгрузок от различных украинских маркетов (не буду никого смущать прямыми ссылками), удивлен тем, что многие используют обыкновенную шаблонную методику, вроде:

```php productID?>” top=”0”> name)?> price?> categoryID?> description)?> productID)?> image)?> ```

Я уже молчу о том, что в данном конкретном примере присутствуют short_open_tags.
Но почему не использовать встроенные в PHP 5 DOM-классы? Это дает нам такие преимущества (навскидку):

  • гарантированная валидность результата (и соответствие DTD, если его указать)
  • автоматическое форматирование ($dom -> formatOutput = true;)
  • автоматическое преобразование кодировки – достаточно указать нужную в заголовке файла.

Посмотрим на генерацию того же фрагмента XML средствами DomDocument:

```php appendChild( $dom->createElement('item')); $item -> setAttribute('id', $o->productID); $item -> setAttribute('top', '0'); $item -> appendChild( $dom->createElement('price', $record['price'])); $item -> appendChild( $dom->createElement('categoryId', $o->categoryID)); $item -> appendChild( $dom->createElement('name',htmlspecialchars($o->name))); $item -> appendChild( $dom->createElement('description', htmlspecialchars($o->description))); $item -> appendChild( $dom->createElement('url', htmlspecialchars("http://myshop.kiev.ua/index.php?productID=".$o->productID))); $item -> appendChild( $dom->createElement('image', htmlspecialchars("http://myshop.kiev.ua/pictures/".$o->image))); ```

Разве этот код не понятнее и структурнее, чем tag soup из первого примера? Да, писать придется немного больше, зато ты никаким образом не отдашь в XML неэскейпленные символы, незакрытые теги и прочий мусор.

Немного теории

Для начала все, что надо знать – это пять функций. Почитай их описание в PHP Manual:

  • $dom = DOMDocument::loadXML(''); – создает документ вместе с корневым элементом $dom -> documentElement
  • DOMElement::setAttribute('name', $value) – устанавливает атрибут
  • DOMElement::appendChild( $dom->createElement('name', [$text]) ) – создает в документе элемент text и добавляет в другой элемент
  • $dom->saveXML() – отдает всю эту красоту в виде строки

Все, дальше курим маны и больше никогда, никогда, никогда не выводим XML шаблонами.