![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
список IXMLNode
zlodey © (2010-08-18 21:21:00)имеется список имен xml-файлов одинаковой структуры. Нужно на начальном этапе сформировать список записей типа IXMLNode взяв из каждого из xml-фалов списка по определенному ноду (IXMLNode). Сделал небольшие наброски, но чет не работает, валяться AccessViolation'ы. Помогите разобраться.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, XMLIntf, XMLDoc;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
PIXMLNode = ^IXMLNode;
TIntfs = class(TList)
private
function Get(Idx: Integer): PIXMLNode;
protected
procedure Notify(Ptr: Pointer; Act: TListNotification); override;
public
function Add(xml_node: PIXMLNode): Integer;
{ }
property Intfs[Idx: Integer]: PIXMLNode read Get; default;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TIntfs }
function TIntfs.Add(xml_node: PIXMLNode): Integer;
begin
Result := inherited Add(xml_node);
end;
function TIntfs.Get(Idx: Integer): PIXMLNode;
begin
Result := PIXMLNode(inherited Get(Idx));
end;
procedure TIntfs.Notify(Ptr: Pointer; Act: TListNotification);
begin
{if Act = lnDeleted then
Dispose(PIXMLNode(Ptr));}
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Intfs: TIntfs;
xml_intf: IXMLDocument;
node: IXMLNode;
begin
xml_intf := TXMLDocument.Create(nil);
xml_intf.LoadFromFile('C:\Documents and Settings\Admin\Рабочий стол\Test.xml');
node := xml_intf.DocumentElement;
ShowMessage(node.NodeName);
Intfs := TIntfs.Create;
Intfs.Add(PIXMLNode(node));
ShowMessage(Intfs[0]^.NodeName);
Intfs.Free;
end;
Медвежонок Пятачок (2010-08-20 16:48:00) [1]взяв из каждого из xml-фалов списка по определенному ноду (IXMLNode).
если "определнный" нод определяется позицией, то да, тесать бревно легко и быстро.
а ежели там определенные ноды - это условие по значениям в атрибутах и прочая мало-мальски непростая логика?
тесать и тесать придется.
Юрий Зотов (2010-08-20 15:43:00) [2]
> Медвежонок Пятачок © (20.08.10 14:14) [8]
Если нужно всего лишь обтесать бревно, то плотник выгоднее.
Медвежонок Пятачок (2010-08-20 14:14:00) [3]TXMLDocument супротив IXMLDOMDocument - это все равно что плотник супротив столяра.
или TTable против TQuery.
Slym (2010-08-20 13:51:00) [4]sniknik © (20.08.10 9:46) [6]
чем это TXMLDocument не угодил
а XPath там есть?
sniknik (2010-08-20 09:46:00) [5]> использовать новый XMLDocument (CreateOleObject('Msxml2.DOMDocument'), а не TXMLDocument)
чем это TXMLDocument не угодил? так как он там в коде ([0]) создается с nil в параметре, возвратом будет интерфейс, что один в один совпадает с предлагаемым.
т.е. хрен на хрен менять только время терять.
Slym (2010-08-20 09:08:00) [6]Slym © (20.08.10 8:54) [4]
например
1. вместо TIntfs использовать новый XMLDocument (CreateOleObject('Msxml2.DOMDocument'), а не TXMLDocument)
2. нужные ноды cloneNode и запихать в XMLDocument
3. а прочую работу уже делать со своим XMLDocument
FinalDoc:=CreateOleObject('Msxml2.DOMDocument');
while true do
begin
Doc:=CreateOleObject('Msxml2.DOMDocument');
Doc.load(FileName);
node1:=Doc.selectSingleNode('root\node');
FinalDoc.documentElement.appendChild(node1.cloneNode(true));
end;
Work(FinalDoc);
Slym (2010-08-20 08:54:00) [7]начальный - конечный этап... ты обрисуй что нужно в итоге, а то может проще можно
Юрий Зотов (2010-08-19 13:05:00) [8]
> zlodey (18.08.10 21:54) [2]
Смешение объектной и интерфейсной моделей есть величайший программерский грех. Избегайте его. Либо одно, либо другое - иначе запросто можно нахватать трудноуловимых глюков.
В чем Вы на собственном опыте и убеждаетесь. И если я не ошибаюсь, то уже во второй раз.
:o)
zlodey (2010-08-18 21:54:00) [9]во блин, не от того наследовался, надо от TInterfaceList. Все разобрался, тему можно закрывать.
Игорь Шевченко (2010-08-18 21:37:00) [10]
> но чет не работает, валяться AccessViolation'ы
Отладчик - рулез фарева