Помогите пожалуйста с запсью/чтеньем XML!!!!

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 25.03.2010 23:53:42

Пробую по переведённому туториалу в вики... но если честно понял не всё... никак разобраться не могу...

Скопировал пример "Генерация файла XML " (в самом низу туториала) запись происходила нормально, попытался удалить лишний родительский раздел, нифига не получается... как из него (XML файла) читать вообще не понял :(

Помогите пожалуйста... прикладываю свой пробничек... :oops:
1111.tar.bz2
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Vadim » 26.03.2010 07:39:31

qivi писал(а):как из него (XML файла) читать вообще не понял

Читать что? Просто так читать файл - занятие совершенно бессмысленное. ;)
Попробуйте заново сформулировать свою проблему.

Добавлено спустя 41 минуту 44 секунды:
:) Странно, что у Вас вообще хоть что-то работало. ;)
Ваш проект выдаёт "Access violation". :)
Вот это точно работает:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 26.03.2010 19:17:47

Спасибо Vadim, ща буду дальше разбираться.

:) Странно, что у Вас вообще хоть что-то работало. ;)
Ваш проект выдаёт "Access violation". :)
Вот это точно работает:

Дак я же и писал:
Скопировал пример "Генерация файла XML " (в самом низу туториала) запись происходила нормально, попытался удалить лишний родительский раздел, нифига не получается...

И я его так и выложил уже и на запись не работающим...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Polugut » 27.03.2010 01:00:53

Из Вашего архива строка комментария
{//Создаём родительский узел // Нафига его создавать чтоб три строчки сохранить????

Создавать обязательно, даже для одной буквы. Даже для пустого. Родительский узел должен быть. И быть один.

Почитайте эти уроки. Мне они очень помогли понять как работать с XML. Правда там примеры для HTML, но внимательно читая можно понять как оно работает. Особенно полезен первый урок, там приведена структура узлов XML-файла , и показаны примеры взаимоотношений этих узлов.
http://xhtml.ru/category/dom_intro/
http://xhtml.ru/2005/04/20/dom_intro_1/ // Первый урок.
Polugut
новенький
 
Сообщения: 19
Зарегистрирован: 25.02.2010 23:50:29

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 29.03.2010 19:48:50

Записываю так:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
xdoc: TXMLDocument;                                    // Переменная документа
KornevoyUzel, DopUzel, Dannie: TDOMNode;               // Переменные узла документа
begin
xdoc:=TXMLDocument.create;                             // Создаём XML документ
KornevoyUzel:=xdoc.CreateElement('Koren'); // Создаём корневой узел документа
Xdoc.Appendchild(KornevoyUzel);                        // Добавляем корневой узел в документ

DopUzel:=xdoc.CreateElement('Informaciya');            // Создаём родительский узел
TDOMElement(DopUzel).SetAttribute('id','001');         // Создаём атрибуты родительского узла
//DopUzel.Appendchild(DopUzel);                        // Сохраняем узел
KornevoyUzel.Appendchild(DopUzel);                     // Добавляем родительский узел

//Создаём дочерний узел
DopUzel:=xdoc.CreateElement('Nazvanie');
Dannie:=xdoc.CreateTextNode(Edit1.Text);               // вставляем значение в узел
DopUzel.Appendchild(Dannie);                           // сохраняем узел
KornevoyUzel.ChildNodes.Item[0].AppendChild(DopUzel);  // вставляем дочерний узел в соответствующий родительский

//Создаём дочерний узел
DopUzel:=xdoc.CreateElement('Avtor');
Dannie:=xdoc.CreateTextNode(Edit2.Text);               // вставляем значение в узел
DopUzel.Appendchild(Dannie);                           // сохраняем узел
KornevoyUzel.ChildNodes.Item[0].AppendChild(DopUzel);  // вставляем дочерний узел в соответствующий родительский

//Создаём дочерний узел
DopUzel:=xdoc.CreateElement('Opisanie');
Dannie:=xdoc.CreateTextNode(Memo1.Text);               // вставляем значение в узел
DopUzel.Appendchild(Dannie);                           // сохраняем узел
KornevoyUzel.ChildNodes.Item[0].AppendChild(DopUzel);  // вставляем дочерний узел в соответствующий родительский

writeXMLFile(xdoc,'1.xml');  // Записываем всё в XML-файл
xdoc.free;                         // Уничтожаем объект в памяти
end;


Читаю так:
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
xdoc:     TXMLDocument;
SD:       TDOMNode;
begin
ReadXMLFile(xdoc, '1.xml'); // Читаем xml файл с жесткого диска

SD:=xdoc.DocumentElement.LastChild.FirstChild.FindNode('Nazvanie');  // Запрашиваем узел"
Edit1.Text:=SD.FirstChild.NodeValue;                                 // Выводим данные узла



SD:=xdoc.DocumentElement.LastChild.FirstChild.FindNode('Avtor');     // Запрашиваем узел"
Edit2.Text:=SD.FirstChild.NodeValue;                                 // Выводим данные узла

SD:=xdoc.DocumentElement.LastChild.FirstChild.FindNode('Opisanie');  // Запрашиваем узел"
Memo1.Text:=SD.FirstChild.NodeValue;                                 // Выводим данные узла

xdoc.Free; // Уничтожаем объект документа в памяти
end;     


Не читает... Что не так?

Добавлено спустя 16 минут 57 секунд:
Пардон, всё так и разобрался!
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 24.04.2010 04:05:55

Как записать нужную мне информацию в файл и как её от тудова считать более или менее разобрался, однако глубоким пониманием устройства и работы с XML похвастаться не могу.

Одна мысль не даёт покоя, как обработать проверку того что открываемый XML файл:
1. вообще является XML (на случай если ктото подсунет программе какойнибудь принципиально др. файл);
2. что структура его соответствует структуре XML файлов создаваемых моей программой?

Проще говоря в случае несоответствия прервать дальнейшие процедуы обработки этого файла ну и сообщить пользователю о несоответствии формата.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Sergei I. Gorelkin » 24.04.2010 05:27:03

Если вместо XML подсунуть не-XML, то ReadXMLFile выбросит исключение EXMLReadError.
Чтобы проверить структуру, можно использовать DTD. См. пример валидации в вики.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Vadim » 24.04.2010 05:55:06

qivi писал(а):1. вообще является XML (на случай если ктото подсунет программе какойнибудь принципиально др. файл);

Начнём с того, что в этом случае файл вообще открыть не удастся. Вылетит ошибка, значит нам её надо отловить:
Код: Выделить всё
Program readxml;
Uses DOM, XMLRead, SysUtils;

Var
  xdoc: TXMLDocument;
 
Begin
  Try
    ReadXMLFile(xdoc, './jopa.xml');
  Except
    on E: EXMLReadError do
      WriteLn('Это фигня какая-то, а не файл xml...');
      WriteLn(E.Message);
  End;
  WriteLn(xdoc.XMLVersion);
End.

qivi писал(а):2. что структура его соответствует структуре XML файлов создаваемых моей программой?

С этим сложнее. Здесь уже Ваша программа, после отурытия файла, должна проверить в нём наличие (как минимум) требуемых секций и требуемых ключей в секциях.
К примеру, можно убедится в наличие всех ключей с помощью метода
TXMLDocument.GetElementsByTagNmae(TagName) : TDOMNodeList;
и сравнивать все TDOMNodeList.Item[n] с заранее предопределённым списком.

Честно говоря, никогда раньше не интересовался подобной проблемой, поэтому не утверждаю, что данный способ оптимален (т.е. с минимальными кодозатратами :) ), может кто-то что-то другое предложит. ;)

Добавлено спустя 29 минут 45 секунд:
Sergei I. Gorelkin
А XML Schema сейчас поддерживается в FPC? Что-то я нигде не нашёл упоминаний...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Sergei I. Gorelkin » 24.04.2010 17:20:47

Vadim писал(а):А XML Schema сейчас поддерживается в FPC? Что-то я нигде не нашёл упоминаний...

Нет, не поддерживается.
Какие-то движения в направлении поддержки схем есть в WST (web service toolkit), но, боюсь, ее оттуда просто так не вычленить.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение sign » 24.04.2010 17:45:04

Я открывал и писал в XML на лазарусе.
Но забил, во многих случаях лучше вместо XML использовать формат JSON и тут
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Vadim » 24.04.2010 19:59:01

sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений. :)
Согласен, что при этом может возникнуть путаница, если при составлении файла будет что-то перепутано. У меня есть программа для студентов, лабораторная работа, где исходные данные формирует преподаватель в виде текстового файла значений и пока что никаких проблем не возникало.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Padre_Mortius » 24.04.2010 21:39:56

В качестве очередного велосипеда, могу предложить делать первоначально проверку на наличие обязательных узлов в xml-файле и только после этого пытаться уже обрабатывать данный файл если он прошел проверку
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 24.04.2010 23:27:02

Vadim писал(а):sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений. :)


Сперва я использовал INI - просто и понятно, всё бы ничего, но возникли проблемы с многострочным полем, записывал он его всё, а вот считывал только первую строчку... можно было б конечно прикрутить какие ни будь педали заменяющие перенос каретки на какую нибудь комбинацию символов до записи в файл и обратно после чтения... но я просто выбрал XML.

В качестве очередного велосипеда, могу предложить делать первоначально проверку на наличие обязательных узлов в xml-файле и только после этого пытаться уже обрабатывать данный файл если он прошел проверку

Padre_Mortius, а как выглядит проверка наличия определённого узла в открытом XML файле? :oops:
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение sign » 25.04.2010 10:59:34

Vadim писал(а):sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений. :)
Согласен, что при этом может возникнуть путаница, если при составлении файла будет что-то перепутано. У меня есть программа для студентов, лабораторная работа, где исходные данные формирует преподаватель в виде текстового файла значений и пока что никаких проблем не возникало.

Суть в другом.
Суть форматов, таких как XML, JSON и других - самодокументируемость данных.

Добавлено спустя 5 минут 15 секунд:
qivi писал(а):
Vadim писал(а):sign
Во многих случаях вообще лучше использовать чисто текстовый файл с жёстко заданной последовательностью значений. :)


Сперва я использовал INI - просто и понятно, всё бы ничего, но возникли проблемы с многострочным полем, записывал он его всё, а вот считывал только первую строчку... можно было б конечно прикрутить какие ни будь педали заменяющие перенос каретки на какую нибудь комбинацию символов до записи в файл и обратно после чтения... но я просто выбрал XML.

В качестве очередного велосипеда, могу предложить делать первоначально проверку на наличие обязательных узлов в xml-файле и только после этого пытаться уже обрабатывать данный файл если он прошел проверку

Padre_Mortius, а как выглядит проверка наличия определённого узла в открытом XML файле? :oops:

Мой путь.
Но тут я удачно наткнулся на JSON.
Для вас - http://www.progdigy.com/?page_id=6
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Padre_Mortius » 25.04.2010 12:29:55

Padre_Mortius, а как выглядит проверка наличия определённого узла в открытом XML файле? :oops:

xml - это своего рода дерево. В своем проекте использовал jvXmlTree из пакета jvcl. Здесь пример использования. Если необходимо, то могу выложить компонент.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 266

Рейтинг@Mail.ru