Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Опять ООП... С XML...

244
13 сентября 2006 года
UAS
2.0K / / 19.07.2006
Вообщем хочу я научиться разбирать xml... Класс немного глючит...

Вот простенький xml-файл:
Код:
<?xml version="1.0"?>
<messages>
 <message id="1">
   <name>UAS</name>
   <email>XML in IE5</email>
 </message>
 <message id="2">
   <name>UkAS</name>
   <email>PHP</email>
 </message>
</messages>


Надо обработать файл и занести данные в массив типа
$array=array();
$array["id тега message"]["тег (name или email)"]="Значение выбранного тега";

Вот сам класс:
Код:
<?php

class UAS_xml {
  var $xml_file=""; # path to xml
 var $xml=""; # содержит сам xml
 var $messages=array(); # массив с данными сообщения. Содержит id поле.
 var $last_id=0; # последнее обработанное сообщение
 var $last_tag=""; # последний обработанный тег
 var $nodesToSelect=array(); # какие id выберать

  function UAS_xml() {

  }

  function loadXML($file) {
    $this->xml_file=$file;
    $this->xml=implode("",file($file));
  }

  function nodesToSelect($start,$end) {
    for($i=$start;$i<=$end;$i++) {
      array_push($this->nodesToSelect,$i);
    }
  }

  function startElementHandler($parser,$name,$attribs) {
    if(strcmp(trim($name),"messages")==0)return;
       
    #echo($name."<br>");
   if(strcmp(trim($name),"message")==0) {
       if(!isset($attribs["id"]))return;
       if(!in_array($attribs["id"],$this->nodesToSelect))return;
       if(isset($this->messages[$attribs["id"]]))return;
       $this->messages[$attribs["id"]]=array();
       $this->last_id=$attribs["id"];
       return;
    }

    $this->messages[$this->last_id][$name]="";
    $this->last_tag=$name;
    return;
  }

  function endElementHandler($parser,$name) {
    if(strcmp(trim($name),"message")==0) {
      $this->last_tag="";
      $this->last_id=0;
    }
  }

  function characterDataHandler($parser,$data) {
    if($this->last_id==0)return;
    if($this->last_tag=="")return;
    #echo("==".$this->last_id." ".$this->last_tag."<br>");
   $this->messages[$this->last_id][$this->last_tag].=$data;
    return;
  }

  function parse() {
    $this->parser = xml_parser_create();
    xml_set_object($this->parser, $this);

    xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
    xml_set_element_handler($this->parser,"startElementHandler","endElementHandler");
    xml_set_character_data_handler($this->parser,"characterDataHandler");

    xml_parse($this->parser,$this->xml,true);
    #xml_parser_free($parser);
}

}

?>


Ну вот... А вот файл который его выводит:
Код:
require("class.uasxml.php");

$xml = new UAS_xml;
$xml->loadXML("books.xml");
$xml->nodesToSelect(0,5);
$xml->parse();

$arr=$xml->messages;

?>
<xmp>
<?=var_dump($arr); ?>
</xmp>


Так вот: var_dump() выводит вот это:

Код:
array(2) {
  [1]=>
  array(2) {
    ["name"]=>
    string(7) "UAS
   "
    ["email"]=>
    string(16) "XML in IE5
   
 "
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(8) "UkAS
   "
    ["email"]=>
    string(9) "PHP
   
 "
  }
}


Почему занчения имеют большую длину, чем исходные??? И почему-то поля name вызываются 3 раза в startElementHandler(), а email 5 раз? :confused:
16K
14 сентября 2006 года
Бян
43 / / 05.09.2006
Цитата:
$array["id тега message"]["тег (name или email)"]="Значение выбранного тега";


Занудство конечно, но у тега не бывает id. Надо понимать чем в xml тег отличается от элемента... что такое атрибут элемнта...

Какие вообще бывают типы элемнтов в xml?
Ну да ладно мне кажется проблемо в том, что в массив каким то образом попадают символу перевода строки их файла. Это даже вижно в var_damp. Поэтому и длина разная...

Попробуйте использовать DOM XML Functions, ими более продвинуто на мой взгляд парсить.

13
14 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=Бян]Занудство конечно, но у тега не бывает id. Надо понимать чем в xml тег отличается от элемента... что такое атрибут элемнта...

Какие вообще бывают типы элемнтов в xml?
Ну да ладно мне кажется проблемо в том, что в массив каким то образом попадают символу перевода строки их файла. Это даже вижно в var_damp. Поэтому и длина разная...

Попробуйте использовать DOM XML Functions, ими более продвинуто на мой взгляд парсить.[/QUOTE]
Ну почему же не бывает? Очень даже бывает. Не стоит забывать что это XML - язык разметки информации.

Советую автору вопроса покопаться еще тут: http://ru.php.net/manual/ru/ref.simplexml.php

В 90% случаев этих функций хватает за глаза. (Кроме тех случаев когда нужно производить какие-то манипуляции с деревом объектов)
240
14 сентября 2006 года
aks
2.5K / / 14.07.2006
Я конечно не веб бпрограммер, но всетки прикопаюсь:
 
Код:
$arr=$xml->messages;

Что это такое? И зачем вобще там публичный доступ к переменным класса? Если хотите ООП, так юзайте ООП а не так =)
16K
14 сентября 2006 года
Бян
43 / / 05.09.2006
[QUOTE=RussianSpy]Ну почему же не бывает? Очень даже бывает. Не стоит забывать что это XML - язык разметки информации.
[/QUOTE]
Занудство конечно, но пример в студию))
13
14 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=Бян]Занудство конечно, но пример в студию))[/QUOTE]
Пажалста
http://www.cbr.ru/scripts/XML_daily.asp?date_req=14/09/2006
244
14 сентября 2006 года
UAS
2.0K / / 19.07.2006
Я знаю что мой код не очень красив... И всё это можно исправить... Просто я делал так чтобы легче было понять вам.. Я и так из кода вырезал половину...

Насчёт SimpleXML и т.д. я тоже знаю... Просто охота было самому научится парсить (учусь через ошибки и иду сложными путями, чтобы себя помучать(такой уж я програмиёр))...:) Ну всё равно пасиб. Придётся мне немного ещё поглумится над кодом
16K
14 сентября 2006 года
Бян
43 / / 05.09.2006
[QUOTE=RussianSpy]Пажалста
http://www.cbr.ru/scripts/XML_daily.asp?date_req=14/09/2006[/QUOTE]

Все что я вижу, это атрибут с именем ID у элементов с именем Value. Причем сдесь теги??
Я же говорил, что я зануда :)
http://ru.wikipedia.org/wiki/XML
13
14 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=Бян]Все что я вижу, это атрибут с именем ID у элементов с именем Value. Причем сдесь теги??
Я же говорил, что я зануда :)
http://ru.wikipedia.org/wiki/XML[/QUOTE]
да согласен - неверно понял ваш комментарий. =)))
13
14 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=UAS]Я знаю что мой код не очень красив... И всё это можно исправить... Просто я делал так чтобы легче было понять вам.. Я и так из кода вырезал половину...

Насчёт SimpleXML и т.д. я тоже знаю... Просто охота было самому научится парсить (учусь через ошибки и иду сложными путями, чтобы себя помучать(такой уж я програмиёр))...:) Ну всё равно пасиб. Придётся мне немного ещё поглумится над кодом[/QUOTE]
Лучше бы ты взялся за реализацию конкретного проекта, а не мучал бы себя синтетическими упражнениями. И пользы больше и опыт реальный, а не выдуманный
8
14 сентября 2006 года
mfender
3.5K / / 15.06.2005
Друзья мои, вы мучаете себя лишними переливаниями из пустого в порожнее.
Что каксается XML. Вещь перспективная. Его нужно учить и знать. Если сейчас при приёме на работу считается "знание XML будет плюсом", то через пару лет (если не раньше) будет "без знания XML просим не обращаться". Нужно. Нужно. Я уже сам уселся за справочники и руководства. Ибо пользуюсь XML редко и то только в целях RSS. А вот сейчас понимаю, что нужно это знать. Т.к. не хочу я уже связывать свой клиент с БД напрямую. А есть этому только одно (почти одно) противоядие - XML. Хочу сделать толстый клиент с тонким сервантом. Вот и взялся. Оказывается - замечательная вещь!!!
13
14 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
Согласен на все 100%
Лично я использую XML для хранения параметров CMS. Настройка системы и шаблонов в итоге занимает меньше получаса и сайт готов - знай только наполняй контентом. ИМХО XML никогда не заменит БД (да и не для этого он предназначен), но для обмена информацией между приложениями, сайтами, серверами, клиентами, хранения настроек и переменных и т.д. это идеальное решение.
Учите XML (а также его частные случаи RSS, SOAP, WSDL) и прибудет с вами цифровое счастье.
12
14 сентября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=Бян]Занудство конечно, но у тега не бывает id. Надо понимать чем в xml тег отличается от элемента... что такое атрибут элемнта...

Какие вообще бывают типы элемнтов в xml?
Ну да ладно мне кажется проблемо в том, что в массив каким то образом попадают символу перевода строки их файла. Это даже вижно в var_damp. Поэтому и длина разная...

Попробуйте использовать DOM XML Functions, ими более продвинуто на мой взгляд парсить.[/QUOTE]
Занудство конечно, но более продвину то будет использовать DOM функции. А DOM XML это уже даже не вчерашний день... позавчерашний.
12
14 сентября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=UAS]
Надо обработать файл и занести данные в массив типа
$array=array();
$array["id тега message"]["тег (name или email)"]="Значение выбранного тега";
[/QUOTE]
"Не стоит преумножать сущности" ;)
Я тоже много чего для парсинга XML писал. Лишнее это все, тем более сейчас в 5-ке. Используй XPath выражения и функции DOMXPath->query() и прочие.
12
14 сентября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=RussianSpy]Согласен на все 100%
ИМХО XML никогда не заменит БД (да и не для этого он предназначен), [/QUOTE]
Это конечно бесспорно. Однако если на БД не лежат сверх задачи, то и на XML можно сделать. Мне вот лично так проще, чем с БД возиться. Опять же, сайт того от БД-сервера независим.

Форум подобный этому вполне реально держать в XML базе. К слову сказать, сейчас БД и на XML файлах делают, хотя конечно когда язык придумывали под БД его не планировали отводить. Но теория разработки БД на XML существует.

Я не говорю, что этим пытаются заменить обычные схемы построения БД. Реляционные базы данных были есть, и по все видимости, еще долго будут. Однакой сейчас появляются и альтернативные схемы построения которые для некоторых задач будут более выгодны/удобны чем реляционные БД. Даже вот книжка Харрингтона по этому делу валяется ))) пока без надобность правда.
16K
15 сентября 2006 года
Бян
43 / / 05.09.2006
[QUOTE=alekciy]Занудство конечно, но более продвину то будет использовать DOM функции. А DOM XML это уже даже не вчерашний день... позавчерашний.[/QUOTE]
ёпта.
А я даже не знал что в php оно есть. я думал, что dom xml это самое близкое к DOM API...
спасиба.:)
13
15 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=alekciy]Это конечно бесспорно. Однако если на БД не лежат сверх задачи, то и на XML можно сделать. Мне вот лично так проще, чем с БД возиться. Опять же, сайт того от БД-сервера независим.

Форум подобный этому вполне реально держать в XML базе. К слову сказать, сейчас БД и на XML файлах делают, хотя конечно когда язык придумывали под БД его не планировали отводить. Но теория разработки БД на XML существует.

Я не говорю, что этим пытаются заменить обычные схемы построения БД. Реляционные базы данных были есть, и по все видимости, еще долго будут. Однакой сейчас появляются и альтернативные схемы построения которые для некоторых задач будут более выгодны/удобны чем реляционные БД. Даже вот книжка Харрингтона по этому делу валяется ))) пока без надобность правда.[/QUOTE]
Вот как раз таки форум размером с этот в XML держать нереально. Посмотрите сколько тут сообщений и тем, а теперь давайте представим сколько времени будет занимать выборка или поиск.

ЗЫ А чтобы система не зависела от БД умные люди придумали уже много чего: ADODB, ODBC, PDO и т.д.
8
15 сентября 2006 года
mfender
3.5K / / 15.06.2005
Скажу больше: например в Delphi (догадываюсь, что она присутствует и в BC++) есть замечательная вещь - TClientDataSet. С помощью него можно совершенно не маясь сделать БД на XML-файлах. Я попробовал и мне понравилось. Для небольших нагрузок и объёмов - самое оно. Главное, что не нужно никаких движков и всё бесплатно. А так - работаешь с XML, как с обычной базой, также вся выборка происходит, также индексы можно построить. Есть ещё более экономный внутренний формат, который в Notepad'е не изменишь. Да! Ещё есть мастер, который по структуре XML генерирует интерфейсы для более удобной работы с этими файлами.
12
15 сентября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=RussianSpy]Вот как раз таки форум размером с этот в XML держать нереально. Посмотрите сколько тут сообщений и тем, а теперь давайте представим сколько времени будет занимать выборка или поиск.

ЗЫ А чтобы система не зависела от БД умные люди придумали уже много чего: ADODB, ODBC, PDO и т.д.[/QUOTE]
Не, ну а кто говорит, что нужно ВЕСЬ форум пихать в один XML файл? Учитывая, что файл целиком грузиться в ОЗУ и там уже разбирается, то в одном файле все держать будет только идиот.
Хотя приходилось слыхивать о XML базах по 39 ГБ :D
12
15 сентября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=Бян]ёпта.
А я даже не знал что в php оно есть. я думал, что dom xml это самое близкое к DOM API...
спасиба.:)[/QUOTE]
Ну просто функции из DOM XML в пыхе были введены как эспериментальные. Потом их привели в соответсвии с DOM спецификацией от W3C и уже начиная с 5-ой версии пыха DOM функции пришли на смену DOM XML. Теперь уже можно со спокойно совестью говорить о поддежке пыхом DOM API.
13
15 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=alekciy]Не, ну а кто говорит, что нужно ВЕСЬ форум пихать в один XML файл? Учитывая, что файл целиком грузиться в ОЗУ и там уже разбирается, то в одном файле все держать будет только идиот.
Хотя приходилось слыхивать о XML базах по 39 ГБ :D[/QUOTE]

В любом случае это не решит проблему с поиском и скоростью выборки при больших объемах.
244
15 сентября 2006 года
UAS
2.0K / / 19.07.2006
Походу моя тема перешла из раздела "помогите пропарсить" в тему "ччем хорош XML и с чем его едят"...:( Круто, блин!!!:D
12
15 сентября 2006 года
alekciy
3.0K / / 13.12.2005
[QUOTE=RussianSpy]В любом случае это не решит проблему с поиском и скоростью выборки при больших объемах.[/QUOTE]
Кто спорит? Просто каждая задача должна решаться максимально эффективным методом. Если в определенном случае это будет отказ от реляционной базы и работа с базой на XML файлах, то так у нужно делать.
Собственно я об этом.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог