![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка 3000 xml файлов [D7]
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 помогает