<?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>
Опять ООП... С XML...
Вот простенький xml-файл:
Код:
Надо обработать файл и занести данные в массив типа
$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);
}
}
?>
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>
$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
"
}
}
[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:
Цитата:
$array["id тега message"]["тег (name или email)"]="Значение выбранного тега";
Занудство конечно, но у тега не бывает id. Надо понимать чем в xml тег отличается от элемента... что такое атрибут элемнта...
Какие вообще бывают типы элемнтов в xml?
Ну да ладно мне кажется проблемо в том, что в массив каким то образом попадают символу перевода строки их файла. Это даже вижно в var_damp. Поэтому и длина разная...
Попробуйте использовать DOM XML Functions, ими более продвинуто на мой взгляд парсить.
Какие вообще бывают типы элемнтов в xml?
Ну да ладно мне кажется проблемо в том, что в массив каким то образом попадают символу перевода строки их файла. Это даже вижно в var_damp. Поэтому и длина разная...
Попробуйте использовать DOM XML Functions, ими более продвинуто на мой взгляд парсить.[/QUOTE]
Ну почему же не бывает? Очень даже бывает. Не стоит забывать что это XML - язык разметки информации.
Советую автору вопроса покопаться еще тут: http://ru.php.net/manual/ru/ref.simplexml.php
В 90% случаев этих функций хватает за глаза. (Кроме тех случаев когда нужно производить какие-то манипуляции с деревом объектов)
Код:
$arr=$xml->messages;
Что это такое? И зачем вобще там публичный доступ к переменным класса? Если хотите ООП, так юзайте ООП а не так =)
[/QUOTE]
Занудство конечно, но пример в студию))
[QUOTE=Бян]Занудство конечно, но пример в студию))[/QUOTE]
Насчёт SimpleXML и т.д. я тоже знаю... Просто охота было самому научится парсить (учусь через ошибки и иду сложными путями, чтобы себя помучать(такой уж я програмиёр))...:) Ну всё равно пасиб. Придётся мне немного ещё поглумится над кодом
http://www.cbr.ru/scripts/XML_daily.asp?date_req=14/09/2006[/QUOTE]
Все что я вижу, это атрибут с именем ID у элементов с именем Value. Причем сдесь теги??
Я же говорил, что я зануда :)
http://ru.wikipedia.org/wiki/XML
Я же говорил, что я зануда :)
http://ru.wikipedia.org/wiki/XML[/QUOTE]
да согласен - неверно понял ваш комментарий. =)))
Насчёт SimpleXML и т.д. я тоже знаю... Просто охота было самому научится парсить (учусь через ошибки и иду сложными путями, чтобы себя помучать(такой уж я програмиёр))...:) Ну всё равно пасиб. Придётся мне немного ещё поглумится над кодом[/QUOTE]
Лучше бы ты взялся за реализацию конкретного проекта, а не мучал бы себя синтетическими упражнениями. И пользы больше и опыт реальный, а не выдуманный
Что каксается XML. Вещь перспективная. Его нужно учить и знать. Если сейчас при приёме на работу считается "знание XML будет плюсом", то через пару лет (если не раньше) будет "без знания XML просим не обращаться". Нужно. Нужно. Я уже сам уселся за справочники и руководства. Ибо пользуюсь XML редко и то только в целях RSS. А вот сейчас понимаю, что нужно это знать. Т.к. не хочу я уже связывать свой клиент с БД напрямую. А есть этому только одно (почти одно) противоядие - XML. Хочу сделать толстый клиент с тонким сервантом. Вот и взялся. Оказывается - замечательная вещь!!!
Лично я использую XML для хранения параметров CMS. Настройка системы и шаблонов в итоге занимает меньше получаса и сайт готов - знай только наполняй контентом. ИМХО XML никогда не заменит БД (да и не для этого он предназначен), но для обмена информацией между приложениями, сайтами, серверами, клиентами, хранения настроек и переменных и т.д. это идеальное решение.
Учите XML (а также его частные случаи RSS, SOAP, WSDL) и прибудет с вами цифровое счастье.
Какие вообще бывают типы элемнтов в xml?
Ну да ладно мне кажется проблемо в том, что в массив каким то образом попадают символу перевода строки их файла. Это даже вижно в var_damp. Поэтому и длина разная...
Попробуйте использовать DOM XML Functions, ими более продвинуто на мой взгляд парсить.[/QUOTE]
Занудство конечно, но более продвину то будет использовать DOM функции. А DOM XML это уже даже не вчерашний день... позавчерашний.
Надо обработать файл и занести данные в массив типа
$array=array();
$array["id тега message"]["тег (name или email)"]="Значение выбранного тега";
[/QUOTE]
"Не стоит преумножать сущности" ;)
Я тоже много чего для парсинга XML писал. Лишнее это все, тем более сейчас в 5-ке. Используй XPath выражения и функции DOMXPath->query() и прочие.
ИМХО XML никогда не заменит БД (да и не для этого он предназначен), [/QUOTE]
Это конечно бесспорно. Однако если на БД не лежат сверх задачи, то и на XML можно сделать. Мне вот лично так проще, чем с БД возиться. Опять же, сайт того от БД-сервера независим.
Форум подобный этому вполне реально держать в XML базе. К слову сказать, сейчас БД и на XML файлах делают, хотя конечно когда язык придумывали под БД его не планировали отводить. Но теория разработки БД на XML существует.
Я не говорю, что этим пытаются заменить обычные схемы построения БД. Реляционные базы данных были есть, и по все видимости, еще долго будут. Однакой сейчас появляются и альтернативные схемы построения которые для некоторых задач будут более выгодны/удобны чем реляционные БД. Даже вот книжка Харрингтона по этому делу валяется ))) пока без надобность правда.
ёпта.
А я даже не знал что в php оно есть. я думал, что dom xml это самое близкое к DOM API...
спасиба.:)
Форум подобный этому вполне реально держать в XML базе. К слову сказать, сейчас БД и на XML файлах делают, хотя конечно когда язык придумывали под БД его не планировали отводить. Но теория разработки БД на XML существует.
Я не говорю, что этим пытаются заменить обычные схемы построения БД. Реляционные базы данных были есть, и по все видимости, еще долго будут. Однакой сейчас появляются и альтернативные схемы построения которые для некоторых задач будут более выгодны/удобны чем реляционные БД. Даже вот книжка Харрингтона по этому делу валяется ))) пока без надобность правда.[/QUOTE]
Вот как раз таки форум размером с этот в XML держать нереально. Посмотрите сколько тут сообщений и тем, а теперь давайте представим сколько времени будет занимать выборка или поиск.
ЗЫ А чтобы система не зависела от БД умные люди придумали уже много чего: ADODB, ODBC, PDO и т.д.
Скажу больше: например в Delphi (догадываюсь, что она присутствует и в BC++) есть замечательная вещь - TClientDataSet. С помощью него можно совершенно не маясь сделать БД на XML-файлах. Я попробовал и мне понравилось. Для небольших нагрузок и объёмов - самое оно. Главное, что не нужно никаких движков и всё бесплатно. А так - работаешь с XML, как с обычной базой, также вся выборка происходит, также индексы можно построить. Есть ещё более экономный внутренний формат, который в Notepad'е не изменишь. Да! Ещё есть мастер, который по структуре XML генерирует интерфейсы для более удобной работы с этими файлами.
ЗЫ А чтобы система не зависела от БД умные люди придумали уже много чего: ADODB, ODBC, PDO и т.д.[/QUOTE]
Не, ну а кто говорит, что нужно ВЕСЬ форум пихать в один XML файл? Учитывая, что файл целиком грузиться в ОЗУ и там уже разбирается, то в одном файле все держать будет только идиот.
Хотя приходилось слыхивать о XML базах по 39 ГБ :D
А я даже не знал что в php оно есть. я думал, что dom xml это самое близкое к DOM API...
спасиба.:)[/QUOTE]
Ну просто функции из DOM XML в пыхе были введены как эспериментальные. Потом их привели в соответсвии с DOM спецификацией от W3C и уже начиная с 5-ой версии пыха DOM функции пришли на смену DOM XML. Теперь уже можно со спокойно совестью говорить о поддежке пыхом DOM API.
Хотя приходилось слыхивать о XML базах по 39 ГБ :D[/QUOTE]
В любом случае это не решит проблему с поиском и скоростью выборки при больших объемах.
Походу моя тема перешла из раздела "помогите пропарсить" в тему "ччем хорош XML и с чем его едят"...:( Круто, блин!!!:D
Кто спорит? Просто каждая задача должна решаться максимально эффективным методом. Если в определенном случае это будет отказ от реляционной базы и работа с базой на XML файлах, то так у нужно делать.
Собственно я об этом.