Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > xml parsing


Автор: MadCow00 11.12.2007, 17:17
есть xml следующей структуры 

Код


<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<Ent RegNum="" DateFin="" Name="Составные элементы технических устройств КМО" ShortName="" DBTable="IC00.DIC_OBJECTS" Group="803" LastNotifNumber="0" WebLink="" AdditionalWebLink="" FileName="" MainTable="1" UndrCnsrct="0" Report="1" SQLText="" CGenName="OBJECT_ID">
  <Lookups>
    <Lookup LookupId="41" Description="Типы технических устройств КМО" SQLText="" ParamName="">
      <LookupFlds>
        <LookupFld Num="1" Name="Тип технического устройства" Size="450"/>
      </LookupFlds>
    </Lookup>
  </Lookups>
  <Fields>
    <Field Number="1" Name="Id объекта" Size="70" AlignNumber="2" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="2" Name="Код" Size="60" AlignNumber="2" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="3" Name="Код символьный" Size="100" AlignNumber="1" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="4" Name="Полное наименование" Size="250" AlignNumber="1" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="5" Name="Наименование" Size="130" AlignNumber="1" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="6" Name="Краткое наименование" Size="130" AlignNumber="1" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="7" Name="Id типа" Size="70" AlignNumber="2" Visible="1" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="8" Name="Тип" Size="200" AlignNumber="1" Visible="0" Filter="1" Lookup="41" FilterField="REFER"/>
    <Field Number="9" Name="Комментарий" Size="90" AlignNumber="1" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="10" Name="Признак системы" Size="70" AlignNumber="2" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="11" Name="Правка" Size="50" AlignNumber="3" Visible="1" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="12" Name="Начало" Size="70" AlignNumber="2" Visible="0" Filter="0" Lookup="0" FilterField=""/>
    <Field Number="13" Name="Окончание" Size="70" AlignNumber="2" Visible="1" Filter="0" Lookup="0" FilterField=""/>
  </Fields>
и т.д.


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

Код


{ Forward Decls }

  IXMLEntType = interface;
  IXMLLookupsType = interface;
  IXMLLookupType = interface;
  IXMLLookupFldsType = interface;
  IXMLLookupFldType = interface;
  IXMLFieldsType = interface;
  IXMLFieldType = interface;
  IXMLOperationsType = interface;
  IXMLOperationType = interface;
  IXMLParamsType = interface;
  IXMLParamType = interface;
  IXMLFieldType2 = interface;
  IXMLFieldType22 = interface;
  IXMLFieldType222 = interface;
  IXMLFieldType2222 = interface;
  IXMLFieldType22222 = interface;
  IXMLFieldType222222 = interface;
  IXMLFieldType2222222 = interface;
  IXMLFieldType22222222 = interface;
  IXMLFieldType222222222 = interface;
  IXMLFieldType2222222222 = interface;
  IXMLFieldType22222222222 = interface;
  IXMLFieldType222222222222 = interface;

и т.д.


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

это возможно?

Автор: aktuba 11.12.2007, 17:24
Цитата(MadCow00 @  11.12.2007,  18:17 Найти цитируемый пост)
при использовании XML Data Binding задаю имя дока

А в ручную не судьба парсить?

Автор: MadCow00 11.12.2007, 17:30
ну это не ответ на вопрос как таковой, именно интересует возможность использования компонента...

может какие-то дополнительные признаки стоит задавать для самих филдов, чтобы парсер понимал в чем фишка? )

Автор: EvilsInterrupt 11.12.2007, 17:53
MadCow00, на против:
Код

  IXMLFieldType2 = interface;
  IXMLFieldType22 = interface;

Когда при создании в XML Data Binding можно убрать галочки на против ихней генерации, главное создать только IXMLFieldType и его одного хватит. Ведь
А работать можно так:
var
 XmlIf : IXMLEntType;
begin
 XmlIf := LoadXXXX...

 XmlIf.XXX.YYY.ZZZ.Params[тут твой индекс].Field

ну вобщем понял, мне влом лезть в дельфю. Но думаю мысль ясна

Автор: Alix 12.12.2007, 11:56
Могу также посоветовать использовать другой парсер, например, от jan - просто и быстро.

Автор: EvilsInterrupt 12.12.2007, 16:01
Alix, Нафиг? Много руками писать, а тут готовый XML Data binding модуль делает, при малом XML-файл и строго заданной структуре это самое наилучшее решение!

Автор: Alix 12.12.2007, 16:17
1. Красивее решение
2. Не используются интерфейсы
3. Быстрее парсит

файл, конечно, может быть и малым, но кто даст гарантию, что не будет расширения программы и файл не начнет содержать больше данных или не поменяет свою структуру?

Автор: aktuba 12.12.2007, 17:16
Цитата(EvilsInterrupt @  12.12.2007,  17:01 Найти цитируемый пост)
Нафиг? Много руками писать

Угу... А можно просто заплатить/попросить и т.д. и вообще ничего руками писать не придется ;)

Цитата(EvilsInterrupt @  12.12.2007,  17:01 Найти цитируемый пост)
а тут готовый XML Data binding модуль делает, при малом XML-файл и строго заданной структуре это самое наилучшее решение!

Честно говоря, раз 5 пробовал его использовать. Плюсов нашел мало, а минусов много. Имхо, не самый удобный инструмент. Да и много вредного и не нужного делает.

Цитата(Alix @  12.12.2007,  17:17 Найти цитируемый пост)
1. Красивее решение
2. Не используются интерфейсы
3. Быстрее парсит

Согласен. Могу добавить:

4. Лучше понимаешь механизм работы самой программы + учишься работать головой, а не руками.

Автор: EvilsInterrupt 12.12.2007, 19:20
Возникла мысль о том, что было бы круто, если бы кто-нить написал визард, который бы действовал также как и XML Data Binding, но только по отношению к TjanXMLParser2.

Автор: Rodman 12.12.2007, 19:31
Цитата(MadCow00 @  11.12.2007,  17:17 Найти цитируемый пост)
 неприятная конструкция из разряда

очень нормальный метод... решает за тебя много вопросов, тебе остается только правильно считать данные...

другой вариант - TXMLDocument

Автор: MadCow00 13.12.2007, 01:20
всем пасип, поковыряюсь ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)