Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с XmlDocuments 
:(
    Опции темы
Jonnik
Дата 29.4.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Подскажите насчет следующего.
Компонент XmlDocument читает только первые два корневых элемента.
Т.е. 
Код

XMLDocument1.ChildNodes.Count
 всегда равно 2 при любом файле xml, но когда я задаю вручную в цикле количество корневых элемента, то он обрабатывает то количество корневых элементов которое указали. Получается, что срабатывает какое-то ограничение. В чем может быть проблема? Код и xml фаил приведен ниже.

Код

var
  i,j,n,m,k,lp:Integer;
  Node,Node1,Node2,Node3: IXMLNode;
  fr,fd:array[1..30] of string;   // ñïèñîê òàáëèö
  s:string;
  t:Boolean;
begin
if Form1.OpenDialog1.Execute then
    begin
      XMLDocument1.LoadFromFile(Form1.OpenDialog1.FileName);    // çàãðóçêà xml
      XMLDocument1.Active:=True;
      XMLDocument1.Encoding:='windows-1251';
      lp:=XMLDocument1.ChildNodes.Count;
     //ShowMessage(Inttostr(lp));
      if LabeledEdit1.Text='0' then lp:=XMLDocument1.ChildNodes.Count
      else  lp:=StrToInt(LabeledEdit1.Text);
      for i:=0 to lp do            //  ïîäñ÷åò êîðíåâûõ ýëåìåíòîâ òèïà Äîêóìåíò
        begin
          if XMLDocument1.DocumentElement.ChildNodes[i].NodeName='Äîêóìåíò' then
            begin
              x[1]:=XMLDocument1.DocumentElement.ChildNodes[i].Attributes['Îò÷åòÃîä']; // îïåðåäåëÿåì çà êàêîé ãîä äàííûå ïî ðàáîòíèêó
              Node := XMLDocument1.DocumentElement.ChildNodes[i];     // Èñïîëüçóåòñÿ ÷òîáû íå ïèñàòü äëèííûå âëîæåíèÿ îäíîãî ðàçäåëà â äðóãóîé        Äàëå ïî òåêòå ìîæíî ïîíÿòü äëÿ ÷åãî
              for j:=0 to Node.ChildNodes.Count-1 do
                begin
                  s:=Node.ChildNodes[j].NodeName;       // Íàçâàíèå ðàçäåëà
                  if s='Ïîëó÷Äîõ' then
                    begin
                      x[2]:=Node.ChildNodes[j].ChildNodes['ÔÈÎ'].Attributes['Ôàìèëèÿ'];     // Çàïèñü â ìàòðèöó àòðèáóòà Ôàìèëèÿ
                      x[3]:=Node.ChildNodes[j].ChildNodes['ÔÈÎ'].Attributes['Èìÿ'];
                      x[4]:=Node.ChildNodes[j].ChildNodes['ÔÈÎ'].Attributes['Îò÷åñòâî'];
                      x[23]:=Node.ChildNodes[j].Attributes['Ñòàòóñ'];
                      x[5]:=Node.ChildNodes[j].Attributes['ÄàòàÐîæä'];
                      Delete(x[5],7,2);                                           // Óäàëåíèå íåíóæíûõ ñèìâîëîâ â ôîðìàòå äàòà
                      x[6]:=Node.ChildNodes[j].Attributes['Ãðàæä'];
                      if x[6]<>'' then x[21]:=x[6];
                      x[7]:=Node.ChildNodes[j].ChildNodes['ÓäËè÷íÔË'].Attributes['ÊîäÓäËè÷í'];
                      if x[7]<>'' then x[22]:=x[7];
                      x[8]:=Node.ChildNodes[j].ChildNodes['ÓäËè÷íÔË'].Attributes['ÑåðÍîìÄîê'];
                      if x[8]<>'' then x[22]:=x[22]+', '+x[8];
                      x[9]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['Èíäåêñ'];
                      if x[9]<>'' then x[21]:=x[21]+', '+x[9];
                      x[10]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['ÊîäÐåãèîí'];
                      if x[10]<>'' then x[21]:=x[21]+', '+x[10];
                      Node3:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'];
                      if  Node3.HasAttribute('Ãîðîä') then                               // ïðîâåðêà íà ñóùåñòâîâàíèå àòðèáóòà
                        begin
                          x[11]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['Ãîðîä'];
                          if x[11]<>'' then x[21]:=x[21]+', '+x[11];
                        end;
                      if  Node3.HasAttribute('Ðàéîí') then
                        begin
                          x[12]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['Ðàéîí'];
                          if x[12]<>'' then x[21]:=x[21]+', '+x[12];
                          x[13]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['ÍàñåëÏóíêò'];
                          if x[13]<>'' then x[21]:=x[21]+', '+x[13];
                        end;
                      if  Node3.HasAttribute('Óëèöà') then
                        begin
                          x[14]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['Óëèöà'];
                          if x[14]<>'' then x[21]:=x[21]+', '+x[14];
                        end;
                      if  Node3.HasAttribute('Äîì') then
                        begin
                          x[15]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['Äîì'];
                          if x[15]<>'' then x[21]:=x[21]+', '+x[15];
                        end;
                      if  Node3.HasAttribute('Êîðïóñ') then
                        begin
                          x[16]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['Êîðïóñ'];
                          if x[16]<>'' then x[21]:=x[21]+', '+x[16];
                        end;
                      if  Node3.HasAttribute('Êâàðò') then
                        begin
                          x[17]:=Node.ChildNodes[j].ChildNodes['ÀäðÌÆÐÔ'].Attributes['Êâàðò'];
                          if x[17]<>'' then x[21]:=x[21]+', '+x[17];
                        end;
                    end;
                  if s='ÑâåäÄîõ' then
                    begin
                      x[18]:=Node.ChildNodes[j].Attributes['Ñòàâêà'];
                      Node:=XMLDocument1.DocumentElement.ChildNodes[i].ChildNodes[j];
                      for n:=0 to Node.ChildNodes.Count-1 do
                        begin
                          s:=Node.ChildNodes[n].NodeName;
                          if s='ÄîõÂû÷' then
                            begin
                              Node1:=Node.ChildNodes[n];
                              for m:=0 to Node1.ChildNodes.Count-1 do          // îïåðåäåëåíèå êîëè÷åñòâà çàïèñåé ñ äîõîäàìè
                                begin
                                  d[m+1,1]:=Node1.ChildNodes[m].Attributes['Ìåñÿö'];         // çàïèñü äàííûõ ïðî äîõîä â ìàòðèöó
                                  d[m+1,2]:=Node1.ChildNodes[m].Attributes['ÊîäÄîõîä'];
                                  d[m+1,3]:=Node1.ChildNodes[m].Attributes['ÑóìÄîõîä'];
                                  Node2:=Node1.ChildNodes[m];
                                  k:=Node2.ChildNodes.Count;
                                  if Node2.HasChildNodes=True then    // Ïðîâåðêà ñóùåñòâîâàíèÿ ðàçäåëà
                                    begin
                                      d[m+1,4]:=Node2.ChildNodes['ÑâÑóìÂû÷'].Attributes['ÊîäÂû÷åò'];
                                      d[m+1,5]:=Node2.ChildNodes['ÑâÑóìÂû÷'].Attributes['ÑóìÂû÷åò'];
                                    end;
                                end;
                            end;
                          if s='ÍàëÂû÷ÑÑÈ' then
                            begin
                              Node1:=Node.ChildNodes[n];
                              for m:=0 to Node1.ChildNodes.Count-1 do
                                begin
                                  d1[m+1,1]:=Node1.ChildNodes[m].Attributes['ÊîäÂû÷åò'];         // çàïèñü äàííûõ ïðî âû÷åò â ìàòðèöó
                                  d1[m+1,2]:=Node1.ChildNodes[m].Attributes['ÑóìÂû÷åò'];
                                end;
                            end;
                          if s='ÑÃÄÍàëÏåð' then
                            begin
                              x[19]:=Node.ChildNodes[n].Attributes['ÍàëÈñ÷èñë'];
                              x[20]:=Node.ChildNodes[n].Attributes['ÍàëÓäåðæ'];
                            end;
                        end;
                    end;
                end;
              if (x[2]<>'') and (x[3]<>'') and (x[4]<>'') then    // Åñëè åñòü âñå ÔÈÎ
                begin
                  n:=1;
                  Delete(x[1],1,2);                            // óäàëåíèå íóíóæíûõ öèôð â ãîäó
                  while d[n,1]<>'' do                          // ïîêà íå ïóñòîé
                    begin
                      t:=False;
                      k:=1;
                      while fr[k]<>'' do
                        begin
                          if fr[k]='zspi'+x[1]+d[n,1] then t:=True;     //  ïðîâåðêà íà ñóùåñòâîâàíèå
                          Inc(k);
                        end;
                      if t=False then
                        begin
                          TabR(x[1]+d[n,1]);            // Ñîçäàíèå òàáëèöû ðàáî÷èõ
                          fr[k]:='zspi'+x[1]+d[n,1];   //Äîáàâëÿåì íàçâàíèå òàáëèöû
                        end;
                      DobR(x[1]+d[n,1]);  // Äîáàâëåíèå ðàáîòíèêà â òàáëèó
                      t:=False;
                      k:=1;
                      while fd[k]<>'' do   // ïîêà íå ïóñòàÿ çàïèñü
                        begin
                          if fd[k]='zdox'+x[1]+d[n,1] then t:=True; // Ïðîâåðêà íà ñóùåñòâîâàíèå òàáëèöû
                          Inc(k);
                        end;
                      if t=False then
                        begin
                          TabD(x[1]+d[n,1]);    // Çàïèñü ðàáîòíèêà â ñîîòâåò òàáëèöó
                          fd[k]:='zdox'+x[1]+d[n,1];  // Äîáàâëÿåì íàçâàíèå òàáëèöû
                        end;
                      k:=0;
                      while d[n+k,1]=d[n,1] do      // ïîêà äâå çàïèñè îäèíàêîâûå, òî ðàáîòàåì
                        begin
                          DobD(x[1]+d[n,1],n+k);    // Çàïèñü äîõîäà â ñîîòâåò òàáëèöó
                          Inc(k);
                          if d[n+k,1]<>d[n,1] then DobNal(x[1]+d[n,1]);
                        end;
                      n:=n+k;
                    end;
                end;
              for j:=1 to 30 do x[j]:='';      // î÷èñòêà ìàòðèö
              for j:=1 to 50 do
                for n:=1 to 6 do d[j,n]:='';
              for j:=1 to 50 do
                for n:=1 to 2 do d1[j,n]:='';
              //if i=5 then Break;      // îãðàíè÷åíèå ïî êîëè÷åñòâó ðàáîòíèêîâ
            end;

        end;
      XMLDocument1.Active:=False;    // Äåàêòèâèðóåì êîìïîíåíò
    end;
end;


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  xml.rar 1,08 Kb
PM MAIL   Вверх
Klio
Дата 29.4.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.4.2008
Где: Харьков - СС_3

Репутация: нет
Всего: 1



попробуй изменить немного, к томуже зачем тратить так много операционного времени:
Код

var
  Head,Node,SubNode,SubN:IXMLNode;
begin
...
  XMLDocument1.Encoding:='windows-1251';
  Head:=XMLDocument1.DocumentElement; //чтобы была на готове как коренной элемент  
  lp:=Head.ChildNodes.Count;
  if LabeledEdit1.Text<>'0' then lp:=StrToInt(LabeledEdit1.Text);

Потом можно пойти двумя путями: цикл for и while
Код

  for i:=0 to lp-1 do  // ты начинаеш с 0 поэтому count-1 а то выбивать будет
    Node:=Head.ChildNodes.items[i];
    if Node.NodeName='Äîêóìåíò' then begin
{ты своим кодом заставляеш компьютер находить опять и опять с начала корневой узел а уже у него опять искать [i] узел при том что ты его уже находил затратно очень}
      x[1]:=Node.Attributes['Îò÷åòÃîä'];
      for j:=0 to Node.ChildNodes.Count-1 do begin
      SubNode:=Node.ChildNodes[j];
      s:=SubNode.NodeName; 
      if s='Ïîëó÷Äîõ' then begin
        Sub:=SubNode.ChildNodes['ÔÈÎ'];
        x[2]:=Sub.Attributes['Ôàìèëèÿ'];
        x[3]:=Sub.Attributes['Èìÿ'];
        x[4]:=Sub.Attributes['Îò÷åñòâî'];
        x[23]:=SubNode.Attributes['Ñòàòóñ'];
        x[5]:=SubNode.Attributes['ÄàòàÐîæä'];
    ...   // остальное в таком же духе

или второй способ вообще без проверки сколько
Код

i:=0;
try k:=strtoint(LabeledEdit1.Text); except k:=0; end;
Node:=Head.ChildNodes.First;
while (Node<>nil)and((k<>0)and(i<k)) do begin  // проходим по всем до конца либо только до опрeделённого номера указанного в Edit
  if Node.NodeName='Äîêóìåíò' then begin  // и далее как в предыдущем примере для for
    ...

  Node:=Head.NextSibling;
end;

Но я могу ошибаться так как:
1) я не знаю используешь в последствии ты значение lp или нет (не проверял, код просмотрел в скользь)
2)твоих комментарий я не понял,
3)ты всё делал преднамеренно и ты знаешь что для тебя лучше в разработки своего кода
4)я не большой спец в этом, всего 6 лет балуюсь...
PS:оптимизируй свою программу

Это сообщение отредактировал(а) Klio - 29.4.2011, 23:31
PM MAIL ICQ   Вверх
halfhope
Дата 12.5.2011, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



Если будет сильно тормозить, то используйте NativeXML. Он намного быстрее... +100500=)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.