Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 209

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Мне необходимо создать документ XML, в котором будет несколько узлов,а внутри каждого узла ещё узлы... их может быть и 5 и 10....

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

Приложение:
  1. a : TXMLItem;
  2. XML: TECXMLParser;
  3.  
  4. XML := TECXMLParser.Create(Self);
  5. XML.Clear;
  6.  
  7.  
  8. a.Name :='name item';
  9. a.text:='my text1'+#13#10;
  10. a.params.values['par1']:='10';
  11. a.new.name:='name1';
  12.  
  13.  
  14.  
  15.  
  16. <?xml version="1.0" encoding="ISO8859-1" ?>
  17. <Test>
  18. <name item par1="10">
  19. my text<br/>
  20. <name1/>
  21. </name item>
  22. </Test>
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30. a.new.name:='name item2';
  31. a.new.text:='my text2'+#13#10;
  32. a.New.Params.Values['par2']:='20';
  33.  
  34.  
  35. <?xml version="1.0" encoding="ISO8859-1" ?>
  36. <Test>
  37. <name item1 par1="10">
  38. my text1<br/>
  39. <name item2/>
  40.  
  41. my text2<br/>
  42. </>
  43. < par2="20"/>
  44. </name item1>
  45. </Test>
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  


yuta_86 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: yuta_86 (статус: Посетитель)
Вопрос отправлен: 25 июня 2012, 16:48
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 20; последнее сообщение — 26 июня 2012, 15:13; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 25 июня 2012, 17:55 [#1]:

TXMLItem.New() - это функция!
Ну почему создатели паскаля (в отличие от создателей Сишника) не сделали обязательными скобки при вызове функций без параметров?!!!11
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 25 июня 2012, 18:05 [#2]:

Пример из моей проги:
procedure TEventOption.SaveToXML(AParentItem: TXMLItem);
var
  Item, SubItem: TXMLItem; // <--- переменные, блин!
begin
  // Сохранение в XML
  inherited;
  Item:= AParentItem.New(); // <--- функция, блин!
  Item.Name:= FName;
  XmlAddStringParam(Item, 'Caption', FCaption);
 
  XmlAddIntegerParam(Item, 'OptionType', Integer(FOptionType));
  XmlAddBoolParam(Item, 'Enabled', FEnabled);
  XmlAddBoolParam(Item, 'ShowPicture', FShowPicture);
 
  case FOptionType of
    eotDaily:      XmlAddTimeParam(Item, 'TriggerTime', FTriggerTime);
  else             XmlAddDateTimeParam(Item, 'TriggerTime', FTriggerTime);
  end; // case
 
  // дни недели срабатывания
  if FOptionType = eotDaily
    then XmlAddIntegerParam(Item, 'TriggerDaysOfWeek', DaysOfWeekToInt(FTriggerDaysOfWeek));
 
  // звуковой файл
  SubItem:= Item.New(); // <--- функция, блин!
  SubItem.Name:= 'Sound';
  XmlAddStringParam(SubItem, 'FileName', FSoundFile);
 
  // картика или текстовое сообщение
  SubItem:= Item.New(); // <--- функция, блин!
  if FShowPicture
    then begin
           SubItem.Name:= 'Picture';
           XmlAddStringParam(SubItem, 'FileName', FPictureFile);
         end
    else begin
           SubItem.Name:= 'Message';
           SubItem.Text:= FMessage;
         end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
yuta_86

yuta_86 (статус: Посетитель), 25 июня 2012, 18:06 [#3]:

вопрос конечно интересный, а по существу есть что-то?
min@y™

min@y™ (статус: Доктор наук), 25 июня 2012, 18:19 [#4]:

Цитата (yuta_86):

вопрос конечно интересный, а по существу есть что-то?

А чо, моих комментов и примера кода недостаточно? Ладно...
  a.new.name:='name item2';  // <--- создал объект
  a.new.text:='my text2'+#13#10; // <--- создал 2-й объект, ссылку на 1-й потерял
  a.New.Params.Values['par2']:='20'; // <--- создал 3-й объект, потерял 2-й!
Молодец! Вижу, мой пример ты не смотрел. Продолжай в том же духе, ибо мне конкуренты ни к чему. :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
yuta_86

yuta_86 (статус: Посетитель), 25 июня 2012, 20:58 [#5]:

ой...когда писал коммент не было кода....извините
завтра на работе обязательно попробую сделать по аналогии. спасибо
yuta_86

yuta_86 (статус: Посетитель), 25 июня 2012, 21:02 [#6]:

код был дан раньше чем Ваш комментарий так что....
так ещё раз.... что значит потерял ссылку на объект.... зачем нужны ссылки ведь мы же создаём файл?потом его выводим в мемо и или сохраняем в файл.....видимо я что-то не понимаю.... можете пояснить?
min@y™

min@y™ (статус: Доктор наук), 25 июня 2012, 21:03 [#7]:

Цитата (yuta_86):

завтра на работе обязательно попробую сделать по аналогии

Ну-ну...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

25 июня 2012, 22:44: Вопрос перемещён из тематического раздела Delphi » Программирование баз данных (БД) в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А. Причина: А БД тут при чём?

yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 09:48 [#8]:

итак посмотрел я ваш код попробовал.....

и чем же отличается ваш код


Item:= AParentItem.New(); // <--- функция, блин!
Item.Name:= FName;
XmlAddStringParam(Item, 'Caption', FCaption);

XmlAddIntegerParam(Item, 'OptionType', Integer(FOptionType));
XmlAddBoolParam(Item, 'Enabled', FEnabled);
XmlAddBoolParam(Item, 'ShowPicture', FShowPicture);



от моего


Items:=XML.Root.New;// <--- функция, блин! ))))
Items.Name:='name';
Items.params.values['Caption']:='your caption';
Items.params.values['OptionType']:='your OptionType';
Items.params.values['Enabled']:='your bool param';
Items.params.values['ShowPicture']:='your bool param';



я бы хотел получить структуру вида

<?xml version="1.0" encoding="cp1251"?>
<dbBuilder>
<dictionaries>
<measures>
<measure id="11" name="A" />
<measure id="12" name="В" />
<measure id="13" name="МВт" />
</measures>
<structure>
<users>
<user id="11" login="yuta" password="qwerty" name="Юрий" active="1" operator="1" dispatcher="1" admin="1" tcallowed="1" blockallowed="1" />
</users>
<usergroups>
<usergroup id="11" name="Супер_пользователи" />
<usergroup id="13" name="Диспетчеры" />
</usergroups>
<Districts>
<District ID="11" Name="РЭС" />
</Districts>
<IPAddresses>
<IPAddress ID="11" DAServerID="11" EthID="1" IPAddr="192.168.3.127" />
</IPAddresses>
</structure>
</dbBuilder>

про то почему создаётся кодировка ISO8859-1 ? как мне её поменять? на utf-8 например....
ни слова не сказали....
yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 09:53 [#9]:

не понятно как сделать узлы <users> <Districts> и тд...
это ведь как разделы...в которых уже узлы с параметрами

<measure id="11" name="A" />

<user id="11" login="yuta" password="qwerty" name="Юрий" active="1" operator="1" dispatcher="1" admin="1" tcallowed="1" blockallowed="1" />
<District ID="11" Name="РЭС" /> и тд это всё ясно Item.New... и пошёл дальше...
min@y™

min@y™ (статус: Доктор наук), 26 июня 2012, 10:32 [#10]:

В твоём XML нет закрывающего тега к тегу dictionaries. Я его убрал, получилось вот что:
<?xml version="1.0" encoding="cp1251"?>
  <dbBuilder>
    <measures>
      <measure id="11" name="A" />
      <measure id="12" name="В" />
      <measure id="13" name="МВт" />
    </measures>
 
    <structure>
      <users>
        <user id="11" login="yuta" password="qwerty" name="Юрий" active="1" operator="1" dispatcher="1" admin="1"
tcallowed="1" blockallowed="1" />
      </users>
 
      <usergroups>
        <usergroup id="11" name="Супер_пользователи" />
        <usergroup id="13" name="Диспетчеры" />
      </usergroups>
 
      <Districts>
        <District ID="11" Name="РЭС" />
      </Districts>
 
      <IPAddresses>
        <IPAddress ID="11" DAServerID="11" EthID="1" IPAddr="192.168.3.127" />
      </IPAddresses>
    </structure>
  </dbBuilder>

Вот пример кода для построения такой структуры:

var
  Item, SubItem: TXMLItem;
begin
  Parser.Root.Name:= 'dbBuilder';
  Item:= Parser.Root.New();         // dbBuilder\measures
  Item.Name:= 'measures';
 
  SubItem:= Item.New();             // dbBuilder\measures\measure
  SubItem.Name:= 'measure';
  SubItem.Params.Add('id=11');
  SubItem.Params.Add('name=А');
  SubItem:= Item.New();             // dbBuilder\measures\measure
  SubItem.Name:= 'measure';
  SubItem.Params.Add('id=12');
  SubItem.Params.Add('name=В');
  SubItem:= Item.New();             // dbBuilder\measures\measure
  SubItem.Name:= 'measure';
  SubItem.Params.Add('id=13');
  SubItem.Params.Add('name=МВт');
 
  Item:= Parser.Root.New();         // dbBuilder\structure
  Item.Name:= 'structure';
 
  SubItem:= Item.New();             // dbBuilder\structure\users
  SubItem.Name:= 'users';
 
  with SubItem.New() do             // dbBuilder\structure\users\user
    begin
      Name:= 'user';
      Params.Add('id=11');
      Params.Add('login=yuta');
      Params.Add('password=qwerty');
      // и так далее для остальных параметров
    end;
 
  SubItem:= Item.New();             // dbBuilder\structure\usergroups
  SubItem.Name:= 'usergroups';
 
  with SubItem.New() do             // dbBuilder\structure\usergroups\usergroup
    begin
      Name:= 'usergroup';
      Params.Add('id=11');
      Params.Add('name=Супер_пользователи');
    end;
 
  with SubItem.New() do             // dbBuilder\structure\usergroups\usergroup
    begin
      Name:= 'usergroup';
      Params.Add('id=13');
      Params.Add('name=Диспетчеры');
    end;
 
  // ... ну и так далее для остальных узлов и подузлов
end;

Цитата (yuta_86):

про то почему создаётся кодировка ISO8859-1 ? как мне её поменять? на utf-8 например.... ни слова не сказали....


Про кодировку - не знаю, меня устраивает та, что по умолчанию. Если хочешь, обработай исходники напильником или напиши письмо автору компонента.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 10:52 [#11]:

ааа понятно это свойство NAME узла....
странно то что если SubItem.New()вызывать так то при запуске баг вылетает а если так SubItem.New то всё гуд.

смотрел форум и видел до этого что Вы min@y™: очень редко помогали людям в плане XML....a тут мне помогли...спасибо.вынужденен признать ВЫ ПРО. СПАСИБО

p.s. +1 к рейтингу
min@y™

min@y™ (статус: Доктор наук), 26 июня 2012, 11:00 [#12]:

Цитата (yuta_86):

ааа понятно это свойство NAME узла....

Ну, дык, йопть!...

Цитата (yuta_86):

странно то что если SubItem.New()вызывать так то при запуске баг вылетает а если так SubItem.New то всё гуд.

Не верю! (© К. Станиславский)

Цитата (yuta_86):

смотрел форум и видел до этого что Вы min@y™: очень редко помогали людям в плане XML...

Да неужели? Плохо смотрел. Я здесь помогаю всем, если могу помочь и люди готовы эту помощь получить.

Цитата (yuta_86):

a тут мне помогли...спасибо.

Спасибо - это много. Пива достаточно! :)

Цитата (yuta_86):

вынужденен признать ВЫ ПРО.

Не преувеличивай.

З.Ы. В качестве бонуса могу подарить пару самодельных вспомогательных модулей для работы с XML с помощью TECXMLParser.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 11:02 [#13]:

Будете пить ПИВО потеряете статс ПРО....так что берегите себя.
min@y™

min@y™ (статус: Доктор наук), 26 июня 2012, 11:06 [#14]:

Цитата (yuta_86):

Будете пить ПИВО потеряете статс ПРО....так что берегите себя.

Мне пох на статусы и прочую условную хню. А пиво я люблю. Мне 33 года, не надо меня учить жить: это неприлично.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 11:10 [#15]:

ок...здоровье не вечно...я просто дал совет
yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 13:41 [#16]:

min@y™: а каким образом после построения и вывода результата в мемо и сохранение в файл можно искать элемент?
например как мне найти
name=Супер_пользователи в <usergroup> а тот в <usergroups>

как происходит обход по документу?
min@y™

min@y™ (статус: Доктор наук), 26 июня 2012, 14:38 [#17]:

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

Цитата (yuta_86):

например как мне найти name=Супер_пользователи в а тот в


Ну, как-то так:

var
  UserGroupsItem, NeededItem: TXMLItem;
  Index, ParamIndex: Integer;
begin
  UserGroupsItem:= Parser.Root.NamedItem['structure'].NamedItem['usergroups'];
  NeededItem:= nil;
 
  for Index:= 0 to UserGroupsItem.Count - 1 do
    begin
      for ParamIndex:= 0 to UserGroupsItem[Index].Params.Count - 1 do
        if (UserGroupsItem[Index].Params.Names[ParamIndex] = 'name') and
           (UserGroupsItem[Index].Params.Values[ParamIndex] = 'Супер_пользователи')
          then begin
                 NeededItem:= UserGroupsItem[Index]; // найдено
                 Break;
               end;
 
      if Assigned(NeededItem)
        then Break;
    end;
 
  // далее - работа с NeededItem
end;

Однако, меня такой подход однозначно не устроил, очень муторный он. Поэтому я использую парсер только для загрузки и сохранения древовидной структуры в файл, а вот для хранения инфы в памяти использую отдельный класс, который сводит на нет потребность вообще в каком-либо поиске. Могу дать тебе пример такого класса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 14:51 [#18]:

ну понятное дело что

Parser: TECXMLParser;
Parser.SaveToFile('1.xml');

я так понимаю что когда мы пишем
Parser := TECXMLParser.Create(Self);
Item:= Parser.Root.New;

то у нас на создаётся xml документ а потом узел строится на основе документа? и ведь документ знает о структуре самого себя...ну как-то коряво объяснил...надеюсь вы поняли
так ли это?

а если я не знаю структуру документа но хочу найти какой-то элемент то как мне быть?
был бы рад получить пример )
min@y™

min@y™ (статус: Доктор наук), 26 июня 2012, 15:08 [#19]:

Цитата (yuta_86):

а если я не знаю структуру документа но хочу найти какой-то элемент то как мне быть?

Тут надо просто написать рекурсивную функцию, подобную функции поиска файлов с заходом в подкаталоги.

Цитата (yuta_86):

был бы рад получить пример

Ну, создай новый вопрос. Будет время - напишу ответ. Укажи в вопросе входные данные, т.е. критерии поиска.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
yuta_86

yuta_86 (статус: Посетитель), 26 июня 2012, 15:13 [#20]:

min@y™:

вот для хранения инфы в памяти использую отдельный класс, который сводит на нет потребность вообще в каком-либо поиске. Могу дать тебе пример такого класса.

я об этом говорил

по поводу темы сейчас создам

26 сентября 2012, 15:37: Статус вопроса изменён на решённый (изменил модератор DNK)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.05 сек.