Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

TXMLDocument   Найти похожие ветки 

 
DimOk ©   (2007-09-05 11:26) [0]

Добрый день уважаемые мастера. Подскажите пожалуйсто, что я  не так делаю. Есть 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
В чем может быть дело? За ранее всем благодарен.


 
palva ©   (2007-09-05 11:34) [1]

XMLFile.DocumentElement...


 
DimOK ©   (2007-09-05 11:40) [2]


> XMLFile.DocumentElement...

value := XMLFile.DocumentElement.GetAttribute("dateFirst");
Если это так, то такая же ошибка :(


 
Reindeer Moss Eater ©   (2007-09-05 11:50) [3]

А вот это посмотри:
ShowMessage(XMLFile.ChildNodes.First.NodeName);


 
DimOK ©   (2007-09-05 12:00) [4]


> ShowMessage(XMLFile.ChildNodes.First.NodeName);

Тоже самое, но я думаю что дело в том что нет XMLFile.Active := True;
Добавил.... и теперь вообще что то не понятное. Ошибка Access violation at address 00000000 и т.п.......


 
Reindeer Moss Eater ©   (2007-09-05 12:02) [5]

Суть в том, что ты ломишься не к тому узлу, к которому хотел.


 
DimOK ©   (2007-09-05 12:12) [6]


> Суть в том, что ты ломишься не к тому узлу, к которому хотел.

Понятно. Я и  ChildNodes["Data"].GetAttribute("dateFirst"); но все так же....(плохо)


 
Reindeer Moss Eater ©   (2007-09-05 12:14) [7]

Понятно, что будет плохо.
Строишь трехколенный вызов, и абсолютно уверен, что все они возвращают валидные элементы.


 
DimOK ©   (2007-09-05 12:17) [8]


> Строишь трехколенный вызов, и абсолютно уверен, что все
> они возвращают валидные элементы.

Как правильно то...?


 
Reindeer Moss Eater ©   (2007-09-05 12:19) [9]

Проверять надо


 
DimOK ©   (2007-09-05 12:22) [10]


> Проверять надо

XMLFile.DocumentElement возврощаят nil


 
DimOK ©   (2007-09-05 12:24) [11]


> XMLFile.DocumentElement возврощаят nil

И XMLFile.ChildNodes.First тоже nil


 
novill ©   (2007-09-05 12:26) [12]

а у тебя файл точно открывается?
попробуй из него хоть что-то получить. например, сам текст хмл.


 
Reindeer Moss Eater ©   (2007-09-05 12:29) [13]

XMLFile.ChildNodes.First тоже nil

Но тебе же на это по барабану. Ты ничего не проверяешь.


 
Reindeer Moss Eater ©   (2007-09-05 12:31) [14]

И в исходники смотреть - не царское это дело

constructor TXMLDocument.Create(const AFileName: DOMString);
begin
 inherited Create(nil);
 FFileName := AFileName;
end;

И все.
Никаких намеков на загрузку самого документа


 
DimOK ©   (2007-09-05 12:31) [15]


> а у тебя файл точно открывается?
> попробуй из него хоть что-то получить. например, сам текст
> хмл.

В отладчике:
XMLFile := TXMLDocument.Create("C:\Выгрузка.xml");

XMLFile =  ([csInheritable]) - не зная что это значит. А ShowMessage(XMLFile.XML.Text) выдает ошибку RUNTime


 
DimOK ©   (2007-09-05 12:35) [16]


> И в исходники смотреть - не царское это дело

Instantiates a TXMLDocument object.

Delphi syntax:

constructor Create(const AFileName: DOMString); reintroduce; overload;

Это из справки.....


 
Reindeer Moss Eater ©   (2007-09-05 12:36) [17]

Я же тебе показал что делает конструктор.


 
novill ©   (2007-09-05 12:36) [18]

код показывай.


 
Reindeer Moss Eater ©   (2007-09-05 12:38) [19]

Все давно уже показано еще в самом вопросе


 
DimOK ©   (2007-09-05 12:42) [20]


> Я же тебе показал что делает конструктор.

Понятно, но
XMLFile := TXMLDocument.Create("C:\Выгрузка.xml");
XMLFile.LoadFromFile("C:\Выгрузка.xml"); // Вылетает ошибка RUNTime опять.


 
Lacmus ©   (2007-09-05 12:45) [21]

>DimOK

Осталось опубликовать полный текст XML-документа


 
DimOK ©   (2007-09-05 12:46) [22]


> Осталось опубликовать полный текст XML-документа

Текст приведен в вопросе (его часть) закрой тэг Data вот и полный текст :)


 
Reindeer Moss Eater ©   (2007-09-05 12:48) [23]

XMLFile := TXMLDocument.Create("C:\Выгрузка.xml");
XMLFile.LoadFromFile("C:\Выгрузка.xml"); // Вылетает ошибка RUNTime опять.


Неправда. Либо код не такой, либо ошибка не здесь.

например:
Твой XMLFile созданный таким контсруктором - чисто интерфейсная ссылка.
Вышла из области видимости и умерла.
А ты продолжаешь  использовать её


 
Lacmus ©   (2007-09-05 12:53) [24]

>DimOK ©   (05.09.07 12:46) [22]

Value = "02.05.2007 10:57:40"


 
DimOK ©   (2007-09-05 12:54) [25]


> например:
> Твой 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");


 
DimOK ©   (2007-09-05 12:55) [26]


> Value = "02.05.2007 10:57:40"

Ну да. А как это получилось?...... :)


 
Lacmus ©   (2007-09-05 12:57) [27]



<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 13:01) [28]


> XMLFile.Active := True;

На этой строке у меня прекращается выполнение программы...


 
Reindeer Moss Eater ©   (2007-09-05 13:03) [29]

После конструктора сделай _AddRef своему документу.


 
novill ©   (2007-09-05 13:19) [30]

> [28] DimOK ©   (05.09.07 13:01)
>
> > XMLFile.Active := True;
>
> На этой строке у меня прекращается выполнение программы...

значит у тебя проблема с самим документом.


 
Lacmus ©   (2007-09-05 13:42) [31]

>DimOK ©   (05.09.07 13:01) [28]

В Delphi 2007 все нормально, в Delphi 7 поможет Reindeer Moss Eater ©   (05.09.07 13:03) [29]


 
DimOK ©   (2007-09-05 14:07) [32]


> После конструктора сделай _AddRef своему документу.

_AddRef method (TXMLNode)


 
Lacmus ©   (2007-09-05 14:20) [33]

Еще вариант



XMLFile: IXMLDocument; { XMLIntf}



 
Reindeer Moss Eater ©   (2007-09-05 14:43) [34]

> После конструктора сделай _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;
....


 
palva ©   (2007-09-05 15:38) [35]

Во первых, в файле русские буквы. Поэтому нужно указание кодировки.

<?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;


 
Svatlena   (2007-09-05 15:50) [36]

А у меня вот так работает

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;


 
Reindeer Moss Eater ©   (2007-09-05 16:02) [37]

ссылка не выходит за пределы видимости - вот и работает.


 
DimOK ©   (2007-09-05 17:02) [38]

Всем спасибо, разобрался :)


 
DimOK ©   (2007-09-05 17:11) [39]

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:13) [40]

Хотя и можно без
> XMLFile.Active := True;

если
> XMLFile.LoadFromFile("C:\Выгрузка.xml");



Страницы: 1 2 вся ветка

Текущий архив: 2007.09.30;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.024 c
2-1188935109
max_
2007-09-04 23:45
2007.09.30
мышь


11-1172065520
mixail_shar
2007-02-21 16:45
2007.09.30
как провести UPDATE


3-1180336962
Junior)
2007-05-28 11:22
2007.09.30
TDBF и руские буквы


2-1188787345
Виталий_____
2007-09-03 06:42
2007.09.30
RichEdit


2-1188886212
Bast
2007-09-04 10:10
2007.09.30
Проблема