Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка 3000 xml файлов [D7]


Страницы:   1 2

s_ilnar ©   (2005-01-18 21:13:00) 

Имеются более 3000 фалов приблизительно такого содержания (и кол-во увеличивается 500 шт в месяц).
Необходимо Выдергивать некоторые данные

Я пока вижу 2 варианта
1. Подключаться к файлу как к базе данных
2. Открывать файл и получать данные следующим способом
-------------------------------------------------------------------------------------------------------------------
function Xml(FileName:string;Key:string):string;
var
F:File;
Str:array [1..3000] of char;
ss:string;
begin
 AssignFile(F,FileName);
 Reset(F);
 BlockRead(F,Str,FileSize(F));
 CloseFile(F);
 ss:=str;
 if pos('<'+key+'>',ss)=0 then begin xml:='###Error###'; exit; end;
 Delete(ss,1,pos('<'+key+'>',ss)+length(key)+1);
 Delete(ss,pos('<',ss),length(ss));
 Xml:=ss;
end;
--------------------------------------------------------------------------------------------------------------------

МАСТЕРА пожалуйста помогите что делать т.к. файлов более 3000 и обрабатывать эту кучу долговато

Что рекомендуете

-----------------------------------
XML File
-------------------------------
<?xml version="1.0" encoding="windows-1251"?>
<CONTRACT>
<Status>0</Status>
<DealerCode>E000</DealerCode>
<DealerPointCode>E000001</DealerPointCode>
<DealerContractCode>4</DealerContractCode>
<DealerContractDate>2003-12-16</DealerContractDate>
<ABSContractCode></ABSContractCode>
<CUSTOMER>
<CUSTOMERTYPESId>0</CUSTOMERTYPESId>
<SPHERESId>-1</SPHERESId>
<Resident>1</Resident>
<Ratepayer>1</Ratepayer>
<PERSON>
<PERSONTYPESId>0</PERSONTYPESId>
<PERSONNAME>
<SEXTYPESId>0</SEXTYPESId>
<LastName>Иванов</LastName>
<FirstName>Иван</FirstName>
<SecondName>Иванович</SecondName>
</PERSONNAME>
<DOCUMENT>
<DOCTYPESId>1</DOCTYPESId>
<Seria>1010</Seria>
<Number>101010</Number>
<GivenBy>Ивановским РОВД</GivenBy>
<Date>2000-00-00</Date>
<Birthday>2000-00-00</Birthday>
</DOCUMENT>
<INN></INN>
</PERSON><ADDRESS>
<ZIP>400000</ZIP
><Country>Российская Федерация</Country>
<Area></Area>
<Region></Region>
<PLACETYPESId>2</PLACETYPESId>
<PlaceName>Иванов</PlaceName>
<STREETTYPESId>1</STREETTYPESId>
<StreetName>Ивановская</StreetName>
<House>48</House>
<BUILDINGTYPESId>-1</BUILDINGTYPESId>
<Building></Building>
<ROOMTYPESId>-1</ROOMTYPESId>
<Room></Room>
</ADDRESS>
</CUSTOMER>
<BANKPROPLIST/>
<DELIVERY>
<DELIVERYTYPESId>1</DELIVERYTYPESId>
<ADDRESS>
<ZIP>422110</ZIP>
<Country>Российская Федерация</Country>
<Area></Area>
<Region></Region>
<PLACETYPESId>2</PLACETYPESId>
<PlaceName>Иванов</PlaceName>
<STREETTYPESId>1</STREETTYPESId>
<StreetName>Ивановская</StreetName>
<House>48</House>
<BUILDINGTYPESId>-1</BUILDINGTYPESId>
<Building></Building>
<ROOMTYPESId>-1</ROOMTYPESId>
<Room></Room>
</ADDRESS>
<Notes></Notes>
</DELIVERY>
<CONTACT>
<PERSONNAME>
<SEXTYPESId>0</SEXTYPESId>
<LastName>Иванов И.И.</LastName>
<FirstName></FirstName>
<SecondName></SecondName>
</PERSONNAME>
<PhonePrefix>900</PhonePrefix>
<Phone>000000</Phone>
<FaxPrefix></FaxPrefix>
<Fax></Fax>
<EMail></EMail>
<PagerOperatorPrefix></PagerOperatorPrefix>
<PagerOperator></PagerOperator>
<PagerAbonent></PagerAbonent>
<Notes></Notes>
</CONTACT>
<CONNECTIONS>
<CONNECTION>
<PAYSYSTEMSId>3</PAYSYSTEMSId>
<BILLCYCLESId>-1</BILLCYCLESId>
<CELLNETSId>2</CELLNETSId>
<PRODUCTSId>1000</PRODUCTSId>
<PhoneOwner>1</PhoneOwner>
<SerNumber>520000000000000</SerNumber>
<SimLock>0</SimLock>
<IMSI>897000000000000000</IMSI>
<MOBILES>
<MOBILE>
<CHANNELTYPESId>1</CHANNELTYPESId>
<CHANNELLENSId>0</CHANNELLENSId>
<SNB>9000000000</SNB>
<BILLPLANSId>392</BILLPLANSId>
<SERVICES>
<SERVICESId>1</SERVICESId>
<SERVICESId>3</SERVICESId>
<SERVICESId>16</SERVICESId>
<SERVICESId>17</SERVICESId>
<SERVICESId>8</SERVICESId>
</SERVICES>
</MOBILE>
</MOBILES>
</CONNECTION>
</CONNECTIONS>
<Comments></Comments>
<CLIENTVER>1.0.0.275</CLIENTVER>
</CONTRACT>

-------------------------------------


Ditrix   (2005-01-19 10:23:00) [21]

может выход такой?
использовать XML только как формат импорта-експорта данных
а для хранения использовать RDBM


Fay   (2005-01-19 00:36:00) [22]

Anatoly Podgoretsky ©   (18.01.05 23:18) [6]
Если это о размере, то попробуйте открыть в IE такой XML размером ~ 10Мб.


Anatoly Podgoretsky   (2005-01-18 23:18:00) [23]

Fay ©   (18.01.05 23:02) [5]
Это не важно если не использовать Hard Coded массивов и при это не проверять файл на допустимость.


Fay   (2005-01-18 23:02:00) [24]

Блин! Чё за уродскай формат?! Кто придумал вытаскивать атрибуты в элементы?!

По вопросу. Какого размера будут файлы?


Anatoly Podgoretsky   (2005-01-18 22:02:00) [25]

По идее string это до 2 миллиардов символов.
И по второй идее, это на данный момент.


s_ilnar   (2005-01-18 21:50:00) [26]

Alex_Bredin скорее всего мой способ работает быстрее

и на счет str и ss переменных
(ss:string; str:array[1..3000] of char;)
по идее string=255 символов, но когда я ss:=str то ы в ss лежало более 2500 символов. Как это можете обьяснить
И еще файлы на данный момент не превышают 3000 байт


Anatoly Podgoretsky   (2005-01-18 21:36:00) [27]

А вот что ты будешь делать, когда  размер файоа окажется больше 3000 байт
BlockRead(F,Str,FileSize(F));
Тем более, что Str по сути не используется.


Alex_Bredin   (2005-01-18 21:24:00) [28]

в D7 есть библиотеки MSXML, MSXMLDOM, c их помощью можно парсить ХМЛ примерно так(кода кусок):


var
 xml: IXMLDOMDocument;
 n, nn, nnn, nnnn: IXMLDOMNode;
 Query: TTransactionQuery;
 TransactionType: TTransactionType;

begin
 if not fileexists(XMLFileName) then
   raise Exception.Create(Format(RsFileNotFound,[XMLFileName]));
  Result:= TStringList.Create;
  xml := CreateDOMDocument;
  xml.load(XMLFileName);
  n := xml.firstChild;
  while Assigned(n) do
  begin
    if n.nodeName ='нужная нода' then
     begin
      nn:=n.firstChild;
      while assigned(nn) do
        begin
            if nn.nodeName = 'еще нужная дочерняя нода' then
              begin
 


итд итп

плохо что все это недокументировано, но есть MSDN, да и Code completion помогает


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо