Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа с XML


Автор: Erfolg 23.9.2006, 10:11
Подскажите, как реализовать следующую задачу, нужно открыть XML файл и из него вывести в memo нужную информацию
структура файла:
Код

  <?xml version="1.0" ?> 
- <!--  2G BTS XML FILE. INT_ID = 23295 CO_GID = 23295002 
  --> 
- <HWData xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hw_data.xsd">
  <Header time="2006-09-20T21:07:18" uploaded="true" version="1.0" GlobalId="23295002" AccessProtocol="BTSHWA" AdaptationName="BTSUpload" ProprietaryElementAddress="INT_ID=23295" /> 
- <NE objectClass="BCF" objectClassVersion="1" MOID="NE-BSC-711319/DN:NE-BCF-33" NEId="PLMN-PLMN/BSC-711319/BCF-33" operationalState="enabled" NEType="BTS" systemTitle="Ultra" vendorName="NOKIA">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>
- <EQHO MOID="NE-BSC-711319/DN:NE-BCF-33/EQHO-1" objectClass="EQHO" objectClassVersion="1" equipmentHolderId="1" equipmentHolderType="Subrack" equipmentHolderSpecificType="BTSUltraSubrack" locationName="000000-000" version="01">
- <UNIT objectClass="UNIT" objectClassVersion="1" MOID="NE-BSC-711319/DN:NE-BCF-33/PWSB-1" unitTypeActual="PWSB" unitId="1" vendorName="NOKIA" identificationCode="467866A" operationalState="enabled" serialNumber="0S2034546520" version="0105" position="1">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>
  </UNIT>
- <UNIT objectClass="UNIT" objectClassVersion="1" MOID="NE-BSC-711319/DN:NE-BCF-33/PWSB-2" unitTypeActual="PWSB" unitId="2" vendorName="NOKIA" identificationCode="467866A" operationalState="enabled" serialNumber="0S2034546524" version="0105" position="2">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>
  </UNIT>
- <UNIT objectClass="UNIT" objectClassVersion="1" MOID="NE-BSC-711319/DN:NE-BCF-33/PWSB-3" unitTypeActual="PWSB" unitId="3" vendorName="NOKIA" identificationCode="467866A" operationalState="enabled" serialNumber="0S2034546525" version="0105" position="3">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>
  </UNIT>
- <UNIT objectClass="UNIT" objectClassVersion="1" MOID="NE-BSC-711319/DN:NE-BCF-33/DVDC-2" unitTypeActual="DVDC" unitId="2" vendorName="NOKIA" identificationCode="468619A" operationalState="enabled" serialNumber="05D033500547" version="0000102" position="4">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>



Нужно что  бы создавалась 3 колонки с unitTypeActual identificationCode serialNumber
с XML не работал, даже не представляюс с помощью какого компонента это можно сделать

Автор: BUGOR 23.9.2006, 11:58
Посмотри внизу на похожие ссылки... если там не найдёшь, то накидаю тебе программу на регулярках.

Автор: DemoCode 23.9.2006, 12:04
Цитата(Erfolg @  23.9.2006,  11:11 Найти цитируемый пост)
с XML не работал, даже не представляюс с помощью какого компонента это можно сделать 

TXMLDocument с закладки Internet. В хэлпе всё хорошо описано и с примерами.

Автор: Erfolg 23.9.2006, 12:21
ПРобую но ни чего не получается (((
Единственное получилось загрузить в TDGrid с помощью XML Mappera, но мне такой вариант не подходит т.к. у меня около 5 тысяч XML файлов и мне надо из них построить одну базу

Автор: DemoCode 23.9.2006, 12:38
Цитата(Erfolg @  23.9.2006,  13:21 Найти цитируемый пост)
ПРобую но ни чего не получается

Мы все здесь телепаты, поэтому можешь не говорить, что конкретно не получается, сами догадаемся.  smile 

Автор: Erfolg 23.9.2006, 12:50
Цитата

Мы все здесь телепаты, поэтому можешь не говорить, что конкретно не получается, сами догадаемся.   

Действительно........ просто запарился  ((((
можешь накидать примерчек как с помощью XMLDocument можно вывести в мемо (в моем случае)
все UNIT с атрибутами unitTypeActual и serialNumber
Вот XML Файл
Код

 <?xml version="1.0" ?> 
- <!--  2G BTS XML FILE. INT_ID = 7736 CO_GID = 7736002 
  --> 
- <HWData xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hw_data.xsd">
  <Header time="2006-09-20T21:05:47" uploaded="true" version="1.0" GlobalId="7736002" AccessProtocol="BTSHWA" AdaptationName="BTSUpload" ProprietaryElementAddress="INT_ID=7736" /> 
- <NE objectClass="BCF" objectClassVersion="1" MOID="NE-BSC-704569/DN:NE-BCF-33" NEId="PLMN-PLMN/BSC-704569/BCF-33" operationalState="enabled" NEType="BTS" systemTitle="Ultra" vendorName="NOKIA">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>
- <EQHO MOID="NE-BSC-704569/DN:NE-BCF-33/EQHO-1" objectClass="EQHO" objectClassVersion="1" equipmentHolderId="1" equipmentHolderType="Subrack" equipmentHolderSpecificType="BTSUltraSubrack" locationName="000000-000" version="01">
- <UNIT objectClass="UNIT" objectClassVersion="1" MOID="NE-BSC-704569/DN:NE-BCF-33/PWSB-1" unitTypeActual="PWSB" unitId="1" vendorName="NOKIA" identificationCode="467866A" operationalState="enabled" serialNumber="0S2034546642" version="0105" position="1">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>
  </UNIT>
- <UNIT objectClass="UNIT" objectClassVersion="1" MOID="NE-BSC-704569/DN:NE-BCF-33/PWSB-2" unitTypeActual="PWSB" unitId="2" vendorName="NOKIA" identificationCode="467866A" operationalState="enabled" serialNumber="0H7034510184" version="0000105" position="2">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>
  </UNIT>
- <UNIT objectClass="UNIT" objectClassVersion="1" MOID="NE-BSC-704569/DN:NE-BCF-33/PWSB-3" unitTypeActual="PWSB" unitId="3" vendorName="NOKIA" identificationCode="467866A" operationalState="enabled" serialNumber="0H7034510186" version="0000105" position="3">
- <availabilityStatus>
  <AvailabilityStatusEntry>Power On</AvailabilityStatusEntry> 
  </availabilityStatus>



Автор: BUGOR 23.9.2006, 15:05
Добавь на форму контрол ListView, установи компонент TregExpr(поищи по форуму):

Код

procedure TForm1.FormCreate(Sender: TObject);
var
lpData: TStringList;
exp: TRegExpr;
i: dword;
begin
  lpData := TStringList.Create;
  exp := TRegExpr.Create;

  with ListView1 do begin
    Columns.add.Caption := 'unitTypeActual';
    Columns.add.Caption := 'serialNumber';
    Columns[0].Width := 120;
    Columns[1].Width := 120;
  end;

  lpData.LoadFromFile('C:\1.xml');
  i:=0;
  exp.Expression := 'unitTypeActual="[A-Za-z]{4}';
  if exp.Exec(lpData.Text) then begin
    ListView1.Items.Add.Caption := StringReplace(exp.Match[0], 'unitTypeActual="', '', [rfReplaceAll]);
    while exp.ExecNext do
      ListView1.Items.Add.Caption := StringReplace(exp.Match[0], 'unitTypeActual="', '', [rfReplaceAll]);
  end;
  exp.Expression := 'serialNumber="[A-Z0-9]{12}';
  if exp.Exec(lpData.Text) then begin
    ListView1.Items[0].SubItems.add(StringReplace(exp.Match[0], 'serialNumber="', '', [rfReplaceAll]));
    while exp.ExecNext do begin
      inc(i);
      ListView1.Items[i].SubItems.add(StringReplace(exp.Match[0], 'serialNumber="', '', [rfReplaceAll]));
    end;
  end;
end;


Если unitTypeActual всегда 4 буквы, а serialNumber 12 символов, то работать будет... 
Можно было бы попроще сделать, без всяких StringReplace, но оказалось, что TregExpr не поддерживает опережающих проверок, которые в парсинге XML очень полезны.

Автор: drkot 24.9.2006, 13:55
BUGOR, вобще ничего страшного что для разбора xml существует специальный парсер. 
Война как говорится ...., главное маневры.

Цитата(BUGOR @  23.9.2006,  15:05 Найти цитируемый пост)
Если unitTypeActual всегда 4 буквы, а serialNumber 12 символов, то работать будет..

стакими ограничениями .... 
А потом ищи откуда в юзера глюки полезли.

Цитата(BUGOR @  23.9.2006,  15:05 Найти цитируемый пост)
Можно было бы попроще сделать, без всяких StringReplace, но оказалось, что TregExpr не поддерживает опережающих проверок, которые в парсинге XML очень полезны.

Так и зачем тогда это нужно.

Работа с XML на форуме расписана вдоль и поперек. Зачем велосипед с квадратными колесами изобретать?


Erfolg, File->New->Other->XMLBuilder
и будет счастье.

Автор: BUGOR 24.9.2006, 14:37
drkot, читай внимательно топик, я же написал в своём первом сообщении: "Посмотри внизу на похожие ссылки... если там не найдёшь, то накидаю тебе программу на регулярках.", человек стукнул ко мне в icq и попросил накидать пример потому, что у него не получилось что-то с готовыми компонентами, что касается условий, то всё вполне рационально т.к. данные шаблонны если тебя не устраивают ограничения, то нужно просто поправить регулярное выражение и всё. 
Я не считаю нужным юзать огромные библиотеки и компоненты, когда задача стоит всего-лишь в том, чтобы вытащить некоторые данные из документа, целиком его парсить вовсе ненужно. Вообще можно решить это с помощью двух-трёх стандартных функций и решение не будет громоздким, просто оно будет менее элегантным, нежели при использовании TRegExpr. 

К тому же я не вижу смысла в этом споре, ты предложил своё решение проблемы - я своё, пусть человек выбирает, есть по меньшей мере две причины по которым я выбрал собственную реализацию(в данном случае):
1. Собственная реализации будет быстрее.
2. Программу не так раздует. 

Автор: drkot 24.9.2006, 15:03
Цитата(BUGOR @  24.9.2006,  14:37 Найти цитируемый пост)
Я не считаю нужным юзать огромные библиотеки и компоненты,

TRegExpr да это маленикая библиотека на 150 кил чистого кода + по скорости уступает стандартному парсеру раз в 10. 
Спецификация  XML "нестрогая": тоесть есть огромное число допущений по синтаксису и форматированию документа (даже в одном документе одни и теже поля могут быть сформатированы по разному - разделены #10#13 например) и учесть все это в регулярках сложно и нецелесообразно.
Из собственного опыта: в процессе конвертации из HTML(база) в XML(база) из примерно 2000 страниц не было автоматически разобрано порядка 150. Хотя эти страницы генерировались одним PHP скриптом, а регулярки предварительно хорошо оттестировались.

Цитата(BUGOR @  24.9.2006,  14:37 Найти цитируемый пост)
Вообще можно решить это с помощью двух-трёх стандартных функций и решение не будет громоздким, просто оно будет менее элегантным, нежели при использовании TRegExpr. 

Если Вы считаете что реализация в виде классов и интерфейсов менее элегантна то позволю с Вами несогласится.

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

Цитата(BUGOR @  24.9.2006,  14:37 Найти цитируемый пост)
 читай внимательно топик, я же написал в своём первом сообщении

Если Вы незнаете или не владеете средствами работы с XML (тема так и звучит) то наверное стоит почитать 
Цитата(BUGOR @  24.9.2006,  14:37 Найти цитируемый пост)
Посмотри внизу на похожие ссылки.

или послушать что люди скажут, а не подставлять 5-е колесо к телеге.
А потом такие "наученые" приходят на работу и валят перво еже задание, да и реализация получается такая, что вдрож кидает.
Нихочу никого обидеть, но культура в программировании должно присутствовать иначе будет как в чизни. 
Если я неправ то готов выслушать критику в свою сторону (но конструктивную).

Добавлено @ 15:08 
Да и вдовесок.
Я нисколько не посягаю на Ваши знания в области регулярных выражений и их(выражений) ценности в решении поисковых задач.

Автор: BUGOR 24.9.2006, 15:44
Цитата

TRegExpr да это маленикая библиотека на 150 кил чистого кода + по скорости уступает стандартному парсеру раз в 10. 


В данном случае её использование не прибавляет к проекту и 20 кило, какой же прирост мы получим, если будет использовать метод предложенный вами? Я думаю это далеко не 20 Кб.  Насчёт скорости, это слова с неба или Вы их можете подкрепить доказательствами? Или давайте сравнивать, или про скорость работы TRegExpr не упоминать. 

Цитата

Если Вы считаете что реализация в виде классов и интерфейсов менее элегантна то позволю с Вами несогласится.


Я сравнил релизацию с помощью стандартных функций(которая кстати наверняка быстрее, чем при использовании классов). 

Цитата

или послушать что люди скажут, а не подставлять 5-е колесо к телеге.


Ну так скажите, что-нибудь по делу лучше, не поленитесь, возьмите и сравните по скорости и размеру(а что ещё важно клиенту? Красота кода или реализации? Не думаю.) несколько реализаций и покажите нам всем, что лучше, к чему попусту учить меня культуре программирования? Я признаю, что с XML дело не имел, поэтому если Вы мне докажите, что преимущество готовых классов очевидны(в контексте именно этой задачи, а не в целом, потому что я всё это говорю относительно данной темы), то я соглашусь, что в данном случае лучше использовать их.

Цитата

А потом такие "наученые" приходят на работу и валят перво еже задание, да и реализация получается такая, что вдрож кидает.


Я со своими задачами в этой области справляюсь, поэтому оставьте намёки при себе. 

Автор: drkot 24.9.2006, 16:19
Цитата(BUGOR @  24.9.2006,  15:44 Найти цитируемый пост)
какой же прирост мы получим, если будет использовать метод предложенный вами?

Исходни весит 10-20кб в зависимости от сложности файла (полнофункциональная работа в XML базой), если только чтение то -20%, урезка по ненужным полям тоже пропорционально снижает; dcu примерно в 1-2 раза больше исходника (чем больше исходник тем относительно меньше dcu); вносимый в проект код 5-10кб.
Беблиотека TRegExpr: 150кб исходник; 60кб dcu; размер кода в проекте не мерял.
Цитата(BUGOR @  24.9.2006,  15:44 Найти цитируемый пост)
Насчёт скорости, это слова с неба или Вы их можете подкрепить доказательствами?

Цифры косвенные. Мерялось время загрузки и формирования в оперативке некоторой структуры записей. Так при использовании TRegExpr процесс занимал порядка 40-45сек, на стандартном делфяшном (микрософтовском) парсере укладывались в 3 сек. (при использовании парсера из поставки Jedy процесс разбора XML файла 25Мб занимал 120сек.)
Универсальный алгоритм не может работать быстрее специализированного.
Цитата(BUGOR @  24.9.2006,  15:44 Найти цитируемый пост)
Я сравнил релизацию с помощью стандартных функций(которая кстати наверняка быстрее, чем при использовании классов). 

В классах ипользуются теже стандартные функции, только классы сформированы специально под структуру файла, что позволяет работать с файлом как с обычной списком объектов.
Цитата(BUGOR @  24.9.2006,  15:44 Найти цитируемый пост)
Я со своими задачами в этой области справляюсь, поэтому оставьте намёки при себе

А это не в Вашу сторону сказал. Это скорее просто сотрясание воздуха. Просто часто попадаются программисты коротые решают поставленные задачи такими методами, что слов нехватает остается только молчать.
По поводу описания и разъяснений я подумаю о написании статьи. Если тема актуальна конечно.

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

Автор: BUGOR 24.9.2006, 16:41
Цитата

Исходни весит 10-20кб в зависимости от сложности файла (полнофункциональная работа в XML базой), если только чтение то -20%, урезка по ненужным полям тоже пропорционально снижает; dcu примерно в 1-2 раза больше исходника (чем больше исходник тем относительно меньше dcu); вносимый в проект код 5-10кб.


Интересно, неужели универсальны класс для разрбора xml весит так мало? Судя по структуре XML он должен вешать не меньше TRegExpr.

Цитата

Беблиотека TRegExpr: 150кб исходник; 60кб dcu; размер кода в проекте не мерял.


Зато я померил и говорю, что это 18 Кб) 

Цитата

Универсальный алгоритм не может работать быстрее специализированного.


ВОТ, именно поэтому-то я и предложил инвидиальную реализацию, просто не думал, что TRegExpr даст проигрышь(хотя опять же в данном случае не факт). 

Цитата

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


Но опять же универсальность будет тормозить весь этот процесс. 


Автор: drkot 24.9.2006, 17:07
Цитата(BUGOR @  24.9.2006,  16:41 Найти цитируемый пост)
Но опять же универсальность будет тормозить весь этот процесс.

Здесь нет юниверсальности, структура классов и интерфейсы генерируются под конкретную структуру файла.

Положа руку на сердце скажу: "В данной конкретной задаче победит pos + copy + delete." 
Конкретная ситуация, конкретное решение, максимум скорости (особенно если оптимизированные функции использовать).

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