Генерация XML в PHP
July 14, 2008 PHP XML<item id=”<?=$o->productID?>” top=”0”>
<name><?=to_xml($o->name)?></name>
<price><?=$o->price?></price>
<categoryId><?=$o->categoryID?></categoryId>
<description><?=to_xml($o->description)?></description>
<url><?=to_xml(”http://myshop.kiev.ua/index.php?productID=”.$o->productID)?></url>
<image><?=to_xml(”http://myshop.kiev.ua/pictures/”.$o->image)?></image>
</item>
Я уже молчу о том, что в данном конкретном примере присутствуют short_open_tags.
Но почему не использовать встроенные в PHP 5 DOM-классы? Это дает нам такие преимущества (навскидку):
- гарантированная валидность результата (и соответствие DTD, если его указать)
- автоматическое форматирование (
$dom -> formatOutput = true;
) - автоматическое преобразование кодировки – достаточно указать нужную в заголовке файла.
Посмотрим на генерацию того же фрагмента XML средствами DomDocument:
<?php
$item = $dom_items -> 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 шаблонами.