Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Delphi
Перезагрузить страницу Дочерность Дочек XML
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
095 095 вне форума
Member
 
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2007
Angry 10.11.2008, 13:00

Код:
 if Assigned(XMLd.ChildNodes) then
 for a1:=0 to XMLd.ChildNodes.Count-1 do
 if Assigned(XMLd.ChildNodes[a1].ChildNodes) then
 for a2:=0 to XMLd.ChildNodes[a1].ChildNodes.Count-1 do
 if Assigned(XMLd.ChildNodes[a1].ChildNodes[a2].ChildNodes) then
 for a3:=0 to XMLd.ChildNodes[a1].ChildNodes[a2].ChildNodes.Count-1 do
 if Assigned(XMLd.ChildNodes[a1].ChildNodes[a2].ChildNodes[a3].ChildNodes) then
 for a4:=0 to XMLd.ChildNodes[a1].ChildNodes[a2].ChildNodes[a3].ChildNodes.Count-1 do
Пожалуйста, Подскажите как оптимизировать это х..
(Узнать не только количество узлов, но и количество, блин, дочерности узла)
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,249
Сказал(а) спасибо: 26
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 10.11.2008, 13:04

Через рекурсию
Ответить с цитированием
  (#3 (permalink)) Старый
095 095 вне форума
Member
 
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2007
Angry 10.11.2008, 15:06

Цитата:
Через рекурсию
Код:
function GetNodeValue(XMLd:IXMLDocument;XMLn:IXMLNode;NodeName:String):string;
var i:integer;
begin
  AnsiWriteln(XMLn.NodeName);
  if Assigned(XMLd) and (XMLn.NodeName=NodeName) then
  begin
    Result:=XMLn.Text;
    Exit;
  end
  else
  if Assigned(XMLd.ChildNodes) then
  for i:=0 to XMLn.ChildNodes.Count-1 do
  GetNodeValue(XMLd,XMLn.ChildNodes[i],NodeName);
end;
Вылетает "Element does not contain a single text node"
Что же я делаю не так? В коде ниче про текст, а в документе одни вложения во вложениях и в самом конце ветвей есть текст...
Ответить с цитированием
  (#4 (permalink)) Старый
095 095 вне форума
Member
 
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2007
Angry 10.11.2008, 15:09

А млин поправил .. но всеравно какоето гавнище на выходе. ...

Код:
function GetNodeValue(XMLd:IXMLDocument;XMLn:IXMLNode;NodeName:String):string;
var i:integer;
begin
  AnsiWriteln(XMLn.NodeName);
  if Assigned(XMLd) and (XMLn.NodeName=NodeName) then
  begin
    Result:=XMLn.NodeName;
    Exit;
  end
  else
  if Assigned(XMLd.ChildNodes) then
  for i:=0 to XMLn.ChildNodes.Count-1 do
  if GetNodeValue(XMLd,XMLn.ChildNodes[i],NodeName)=NodeName then Result:=XMLn.NodeName;
end;
Ответить с цитированием
  (#5 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,249
Сказал(а) спасибо: 26
Поблагодарили 51 раз(а) в 51 сообщениях
Регистрация: 16.10.2005
По умолчанию 10.11.2008, 15:14

А чего сделать-то надо?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
095 095 вне форума
Member
 
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2007
По умолчанию 10.11.2008, 15:18

Надо в куче деревьев и ветвей неопределенной структуры найти ноду и отдать ее значение или аттрибуты..
Делаю конвертор парсера человека, который ненавидит xsd, xml и xpath..
Ответить с цитированием
  (#7 (permalink)) Старый
095 095 вне форума
Member
 
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2007
По умолчанию 10.11.2008, 16:13

Ффффак ... делфи знает что такое рекурсия? в студии есть программисты? HEElp

Код:
function GetNodeValue(XMLd:IXMLDocument;XMLn:IXMLNode;NodeName:String):string;
var i,j:integer;
begin
  if Assigned(XMLn.ChildNodes) then
  for i:=0 to XMLn.ChildNodes.Count-1 do
  if (XMLn.ChildNodes[i].NodeName=NodeName) then
  begin
    Result:=XMLn.NodeName;
//    Exit;
  end else
  if Assigned(XMLn.ChildNodes[i].ChildNodes) then
  for j:=0 to XMLn.ChildNodes[i].ChildNodes.Count-1 do
  Result:=GetNodeValue(XMLd,XMLn.ChildNodes[i].ChildNodes[j],NodeName);
end;
Ответить с цитированием
  (#8 (permalink)) Старый
095 095 вне форума
Member
 
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2007
По умолчанию 10.11.2008, 16:43

вот так получилось:

Код:
function GetNodeValue(XMLn:IXMLNode;NodeName:String):string;
var i:integer;
begin
  if Assigned(XMLn.ChildNodes) then
  for i:=0 to XMLn.ChildNodes.Count-1 do
  if (XMLn.ChildNodes[i].NodeName=NodeName) then
  begin
    Result:=XMLn.ChildNodes[i].Text;
  end else
  if Assigned(XMLn.ChildNodes[i].ChildNodes) then
  Result:=GetNodeValue(XMLn.ChildNodes[i],NodeName);
end;
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов