Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: XML в PHP5 шаг за шагом...
 
 автор: coloboc66   (27.11.2007 в 12:15)   письмо автору
 
 

Предлагаю всем миром разобраться в этом деле - у самого не получается. Есть простой файл news.xml

<?xml version="1.0"?>
<newsLine>
    <news date="1.1.2007">
        <title>title 1</title>
        <text>news text 1</text>
    </news>
    <news date="5.1.2007">
        <title>title 2</title>
        <text>news text 2</text>
    </news>
    <news date="10.1.2007">
        <title>title 3</title>
        <text>news text 3</text>
    </news>
</newsLine>

Для начала нужно просто вывести эти новости на веб-страничку. Пишу первую строку кода:

<?php
$doc 
= new DOMDocument();
?>

И сразу же получаю ошибку:
Fatal error: Undefined class name 'domdocument' in z:\home\localhost\www\testdir\xml\parser.php on line 2
Где этот класс нужно определять?

   
 
 автор: Саня   (27.11.2007 в 14:26)   письмо автору
 
   для: coloboc66   (27.11.2007 в 12:15)
 

Установите PHP 5 и будет всё работать.

   
 
 автор: coloboc66   (27.11.2007 в 14:30)   письмо автору
 
   для: Саня   (27.11.2007 в 14:26)
 

Так установил всё - не помогает.

   
 
 автор: Axxil   (27.11.2007 в 14:31)   письмо автору
 
   для: coloboc66   (27.11.2007 в 12:15)
 

в денвере дело происходит я так понимаю?
Надо установить расширение php_domxml.dll для вашей версии php

UPD. Если версия 5 то подключать не надо, надо наоборот выключить
Закоментируйте в php.ini строчку
extension=php_domxml.dll

если она там есть

   
 
 автор: coloboc66   (27.11.2007 в 15:02)   письмо автору
 
   для: Axxil   (27.11.2007 в 14:31)
 

Да - в Денвере. Установил Base_PHP5 и расширения РНР. Тут я немного недопонимаю: у меня получилось так: если я присваиваю файлу расширение *.php, то автоматически запускается версия 4 интерпретатора РНР. А если присваиваю расширение *.php5, то автоматически запускается версия 5 интерпретатора и вышеуказанная мной строчка работает без ошибок. Непонятно, почему при установке РНР5 остался РНР4? На сайте Денвера написано, что РНР5 работает не как модуль апача, а как CGI - здесь я тоже не очень понимаю принципиальную разницу между двумя этими понятиями и чем это грозит?

   
 
 автор: mihdan   (27.11.2007 в 15:35)   письмо автору
 
   для: coloboc66   (27.11.2007 в 15:02)
 

при модуле - работает быстрее и безопаснее, можно юзать basic-авторизацию и фунции апача типа сбора заголовков

   
 
 автор: coloboc66   (27.11.2007 в 16:35)   письмо автору
 
   для: mihdan   (27.11.2007 в 15:35)
 

Ну хорошо: вот, наверное, я правильно написал первые строчки

<?php
$doc 
= new DOMDocument();//создаём экземпляр ДОМ-документа
$doc->load('news.xml');//загружаем в него XML-файл
?>

А вот как дальше? Можно было бы просто разбирать без модели DOM, но это наверное неправильно. Например, я хочу, чтобы каждый из узлов news ложился в строку таблицы, где в 1-ой ячейке был бы атрибут тега news date, во второй - значение узла title, в третьей - значение узла text.
А как? АААааааааа?????

   
 
 автор: Lelik   (27.11.2007 в 18:02)   письмо автору
 
   для: coloboc66   (27.11.2007 в 16:35)
 

лучше XSLT использовать.
при xmlе вида

<content>
    <news date="27.11.2007">
        <title>news</title>
        <text>text of news</text>
    </news>
</content>


xsl вида

<xsl:template match="/content">
    <table>
        <xsl:apply-templates />
    </table>
</xsl:template>

<xsl:template match="news">
    <tr>
        <td><xsl:value-of select="@date" /></td>
        <td><xsl:apply-templates select="title" /></td>
        <td><xsl:apply-templates select="text" /></td>
    </tr>
</xsl:template>


на выходе получим

<table>
    <tr>
        <td>27.11.2007</td>
        <td>news</td>
        <td>text of news</td>
    </tr>
</table>

   
 
 автор: coloboc66   (27.11.2007 в 21:10)   письмо автору
 
   для: Lelik   (27.11.2007 в 18:02)
 

Хммм... Как заманчиво. Но xsl, я слыхал, очень сложен для усвоения?

   
 
 автор: Lelik   (27.11.2007 в 22:28)   письмо автору
 
   для: coloboc66   (27.11.2007 в 21:10)
 

ничего особо сложного. основных сложностей две: практика; xPath; (это я по себе сужу). Но есть огромные преймущества: вынос html-разметки из php-кода (в нашем случае, а вообще из серверных сценариев), или другими словами данные, полученные с помощью серверных сценариев, можно получать в любом порядке, а в результате получаем то, что хотим (иначе приходится получать обязательно по порядку данные для шапки, контента, футера); иногда из-за разметки в php-коде, необходимо делать по нескольку запросов для вывода одних и тех же данных, в связке xml+xsl это обходится стороной; при редизайне надо править только файл xsl-разметки, что существенно облегчает саму процедуру редизайна.

ЗЫ. написал так написал: можно в микрософт какой-нибудь копирайтером идти :)

   
 
 автор: coloboc66   (28.11.2007 в 15:11)   письмо автору
 
   для: Lelik   (27.11.2007 в 22:28)
 

Что-то у меня ваш пример с XSL не работает, может настраивать нужно... Потом начну разбираться.
Со своим примером разобрался относительно чтения:

echo '<table border=1px>';
$items=$doc->getElementsByTagName('news');
for ($i = 0; $i < $items->length; $i++) {
echo '<tr>';
    if($items->item($i)->hasAttributes())echo '<td>'.$items->item($i)->getAttribute('date').'</td>';
   echo '<td>'.$items->item($i)->nodeValue . "</td>";
echo '</tr>';
}
echo '</table>';

А вот как добавить к документу новый узел новостей? Пишу:

$news=$doc->createElement('news');
$news->setAttribute('date','28.11.2007');
$title=$doc->createElement('title');
$title->nodeValue='title4';//по-моему здесь что-то не так
$text=$doc->createElement('text');
$text->NodeValue='text4';//и здесь
$news->appendChild($title);
$news->appendChild($text);
$items=$doc->childNodes;
$items->item(0)->appendChild($news);

Но значения узлов не выводятся. Почему?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования