![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TXMLDocument [D7, XP]
DimOk © (2007-09-05 11:26:00)Добрый день уважаемые мастера. Подскажите пожалуйсто, что я не так делаю. Есть XML документ мне нужно получить атрибут первого узла
- <Data dateFirst="02.05.2007 10:57:40" dateLast="02.05.2007 10:57:47" NumMag="131611">
- <doc numdoc="000892" typedoc="В/П" sclad="МZ0211" agentcode="МZ0101" date="02.05.2007" dopcode="082670" codeval="USD" cenaval="1" code_cart="" prim="">
<table nnum="63230179" kol="1" cena="326,1" cenaout="321,48" />
</doc>
- <doc numdoc="000654" typedoc="ПРН" sclad="МZ0101" agentcode="00000А" date="02.05.2007" dopcode="" codeval="USD" cenaval="1" code_cart="" prim="">
<table nnum="61120519" kol="1" cena="289,7067" cenaout="249,87" />
код в Delphi:
procedure load_to_1C_app();
var XMLFile: TXMLDocument;
value: Variant;
node: IXMLNode;
begin
XMLFile := TXMLDocument.Create('C:\Выгрузка.xml');
value := XMLFile.ChildNodes.First.GetAttribute('dateFirst');
......
после выполнения подчеркнутой строчки выдает ошибку:
Abstract Error
В чем может быть дело? За ранее всем благодарен.
DimOK (2007-09-05 17:13:00) [1]Хотя и можно без
> XMLFile.Active := True;
если
> XMLFile.LoadFromFile('C:\Выгрузка.xml');
DimOK (2007-09-05 17:11:00) [2]var XMLFile: IXMLDocument;
value: Variant;
node: IXMLNode;
begin
XMLFile := TXMLDocument.Create(nil);
XMLFile.LoadFromFile('C:\Выгрузка.xml');
XMLFile.Active := True;
node := XMLFile.DocumentElement;
value := node.GetAttribute('dateFirst');
MainForm.Edit1.Text := value;
В таком виде все заработало :)
DimOK (2007-09-05 17:02:00) [3]Всем спасибо, разобрался :)
Reindeer Moss Eater (2007-09-05 16:02:00) [4]ссылка не выходит за пределы видимости - вот и работает.
Svatlena (2007-09-05 15:50:00) [5]А у меня вот так работает
procedure LoadXML(const FileName:String);
var Node,SNode:IXMLNode;
begin
InXML:=TXMLDocument.Create(Form1);
InXML.LoadFromFile(FileName);
Node:=InXML.DocumentElement.ChildNodes[0];
Edit1.Text:=Node.Attributes['dateFirst'];
end;
palva (2007-09-05 15:38:00) [6]Во первых, в файле русские буквы. Поэтому нужно указание кодировки.
<?xml version="1.0" encoding="Windows-1251"?>
<Data dateFirst="02.05.2007 10:57:40" dateLast="02.05.2007 10:57:47" NumMag="131611">
<doc numdoc="000892" typedoc="В/П" sclad="МZ0211" agentcode="МZ0101" date="02.05.2007" dopcode="082670" codeval="USD" cenaval="1" code_cart="" prim="">
<table nnum="63230179" kol="1" cena="326,1" cenaout="321,48" />
</doc>
<doc numdoc="000654" typedoc="ПРН" sclad="МZ0101" agentcode="00000А" date="02.05.2007" dopcode="" codeval="USD" cenaval="1" code_cart="" prim="">
<table nnum="61120519" kol="1" cena="289,7067" cenaout="249,87" />
</doc>
</Data>
У меня в Delphi 7 работает такой код:
procedure TForm1.Button1Click(Sender: TObject);
var
XMLFile: IXMLDocument;
begin
XMLFile := TXMLDocument.Create('C:\123.xml');
XMLFile.Active := True;
Label1.Caption := XMLFile.DocumentElement.GetAttributeNS('dateFirst', '');
end;
Reindeer Moss Eater (2007-09-05 14:43:00) [7]> После конструктора сделай _AddRef своему документу.
_AddRef method (TXMLNode)
Экземпляру документасделай _AddRef
When TXMLDocument is created without an Owner, it behaves like an interfaced object.That is, when all references to its interface are released, the TXMLDocument instance is automatically freed.
А посему, раз не умеешь обращаться с интерфесными ссылками, то просто :
var x: IXMLDocument;
begin
x := TXMLDocument.Create(nil);
x._AddRef;
....
Lacmus (2007-09-05 14:20:00) [8]Еще вариант
XMLFile: IXMLDocument; { XMLIntf}
DimOK (2007-09-05 14:07:00) [9]
> После конструктора сделай _AddRef своему документу.
_AddRef method ( TXMLNode)
Lacmus (2007-09-05 13:42:00) [10]>DimOK © (05.09.07 13:01) [28]
В Delphi 2007 все нормально, в Delphi 7 поможет Reindeer Moss Eater © (05.09.07 13:03) [29]
novill (2007-09-05 13:19:00) [11]> [28] DimOK © (05.09.07 13:01)
>
> > XMLFile.Active := True;
>
> На этой строке у меня прекращается выполнение программы...
значит у тебя проблема с самим документом.
Reindeer Moss Eater (2007-09-05 13:03:00) [12]После конструктора сделай _AddRef своему документу.
DimOK (2007-09-05 13:01:00) [13]
> XMLFile.Active := True;
На этой строке у меня прекращается выполнение программы...
Lacmus (2007-09-05 12:57:00) [14]
<Data dateFirst="02.05.2007 10:57:40" dateLast="02.05.2007 10:57:47" NumMag="131611"/>
procedure TForm50.Button1Click(Sender: TObject);
var XMLFile: TXMLDocument;
value: Variant;
begin
XMLFile := TXMLDocument.Create('C:\123.xml');
XMLFile.Active := True;
value := XMLFile.ChildNodes.First.GetAttribute('dateFirst');
end;
DimOK (2007-09-05 12:55:00) [15]
> Value = '02.05.2007 10:57:40'
Ну да. А как это получилось?...... :)
DimOK (2007-09-05 12:54:00) [16]
> например:
> Твой XMLFile созданный таким контсруктором - чисто интерфейсная
> ссылка.
> Вышла из области видимости и умерла.
Создан вот так:
XMLFile := TXMLDocument.Create(nil);
XMLFile.NodeIndentStr := '<2 spaces>';
XMLFile.Active:=True;
DocumNode := XMLFile.AddChild('Data');
DocumNode.SetAttribute('dateFirst',Mainform.FirstData.DateTime);
DocumNode.SetAttribute('dateLast',Mainform.LastData.DateTime);
DocumNode.SetAttribute('NumMag',Trim(frmSettingsFilesAndDB.NumMag.Text));
.........
XMLFile.SaveToFile(frmSettingsFilesAndDB.PathToReport.Text + '\Выгрузка.xml');
Lacmus (2007-09-05 12:53:00) [17]>DimOK © (05.09.07 12:46) [22]
Value = '02.05.2007 10:57:40'
Reindeer Moss Eater (2007-09-05 12:48:00) [18]XMLFile := TXMLDocument.Create('C:\Выгрузка.xml');
XMLFile.LoadFromFile('C:\Выгрузка.xml'); // Вылетает ошибка RUNTime опять.
Неправда. Либо код не такой, либо ошибка не здесь.
например:
Твой XMLFile созданный таким контсруктором - чисто интерфейсная ссылка.
Вышла из области видимости и умерла.
А ты продолжаешь использовать её
DimOK (2007-09-05 12:46:00) [19]
> Осталось опубликовать полный текст XML-документа
Текст приведен в вопросе (его часть) закрой тэг Data вот и полный текст :)
Lacmus (2007-09-05 12:45:00) [20]>DimOK
Осталось опубликовать полный текст XML-документа