Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.061 c