![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с TXMLDocument и IXMLNode [D7, WinXP]
X9 © (2005-10-05 18:48:00)Всем Hello!
На днях решил использовать XML в своих проектах, но до этого парсингом не занимался.
Допустим, имеется файл следующего содержания:
-----------------C:\temp.xml-----------------
<MyXMLFileFormat Version="1">
<SomeField1>SomeFieldValue1</SomeField1>
<SomeField2>SomeFieldValue2</SomeField2>
</MyXMLFileFormat>
-----------------------------------------------------
Упрощённый код программы:
-----------------------------------------------------
uses
XMLDoc, XMLIntf;
...
procedure DoSomethingWithXML(FileName: string);
var
Doc: TXMLDocument;
Node: IXMLNode;
S: string;
begin
Doc := TXMLDocument.Create(FileName);
Doc.Active := true;
Node := Doc.ChildNodes.First;
S := Node.Attributes['Version'];
ShowMessage(S);
end;
-----------------------------------------------------
При выходе из этой подрограммы возникает AV, но в MessageBox'е выводится нужное значение (1). В Help'е сказано, что освобождать TXMLDocument не нужно, вот цитата оттуда:
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.
Никак не могу понять, в чём проблема. Помогите, пожалуйста!
Заранее всем благодарен,
с уважением, X9.
wal (2005-10-06 13:14:00) [1]
> [13] Чапаев © (06.10.05 11:44)
> так должен начинаться XML-документ.
Не совсем так.
В "Extensible Markup Language (XML) 1.0 (Third Edition)" написано
2.8 Prolog and Document Type Declaration
[Definition: XML documents shouldbegin with an XML declaration which specifies the version of XML being used.]
А что такое shouldописано в rfc2119
3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
may existvalid reasons in particular circumstances to ignore a
particular item, but the full implications must be understood and
carefully weighed before choosing a different course.
Что, вобщем то, совсем не обозначает "ДОЛЖЕН".
С уважением.
Чапаев (2005-10-06 11:44:00) [2]<?xml ...?> -- так должен начинаться XML-документ. Какие там нужно прописать атрубуты -- смотри в спецификации XML.
Igor_thief (2005-10-06 10:20:00) [3]Относительно версий - будет работать там где есть IE.
Относительно проблемы - просто замени в объявлении TXMLDocument на IXMLDocument. Теоретически должно работать.
X9 (2005-10-06 07:10:00) [4]Всё, разобрался!
Если вместо конструктора Create(const AFileName: WideString) использовать Create(AOwner: TComponent) с аргументом <> nil, то всё работает! Однако, остаётся непонятным наличие второго конструктора, если он не работает, и то, почему не работает Create(nil).
Slym (2005-10-06 05:17:00) [5]var
XML:IXMLDocument;
Root,DataNode:IXMLNode;
begin
XML:=LoadXMLDocument(XMLString) as IXMLDocument;
или
XML:=TXMLDocument.Create(nil) as IXMLDocument;;
if XML.IsEmptyDoc then Abort;
Root:=XML.ChildNodes.Last;
DataNode:=Root.ChildNodes.First;
while DataNode<>nil do
begin
DataNode:=DataNode.NextSibling;
end;
Eraser (2005-10-05 23:39:00) [6]
> X9 © (05.10.05 22:47) [8]
;-) держи на Delphi
var
XMLDoc: TXMLDocument;
NewNode, ValueNode: IXMLNode;
AFile: string;
sl1: TStringList;
begin
AFile := 'somefile.xml';
XMLDoc := TXMLDocument.Create(Application);
XMLDoc.Active := true;
sl1 := TStringList.Create;
sl1.Add('<?xml version="1.0" ?><Main></Main>');
sl1.SaveToFile(AFile);
XMLDoc.LoadFromFile(AFile);
NewNode := XMLDoc.DocumentElement.AddChild('Connection');
...
дальше работаешь как и задумывал...
X9 (2005-10-05 22:47:00) [7]2 Eraser
К сожалению, ничего толкого не нашёл.
Хотя ситуация похожая - всё, кажется, проще некуда, но ...
Eraser (2005-10-05 22:38:00) [8]
> X9 © (05.10.05 18:48)
Может это поможет
http://forum.codenet.ru/showthread.php?threadid=14997
X9 (2005-10-05 22:24:00) [9]Про "виндовс" не знаю, но есть большое количество альтернативных парсеров, не уступающим по функциональности продукту Microsoft. Можно посмотреть на http://torry.net.
Snape (2005-10-05 21:58:00) [10]
> X9 © (05.10.05 21:56) [4]
Ну меня больше волнует не версия делфи, а именно версия виндовс =)
X9 (2005-10-05 21:56:00) [11]2 Snape
Насчёт версий Windows не знаю, точно работает на Delphi7/WinXP. Где-то читал, что для более ранних версий Delphi нужно было отдельно импортировать библиотеку типов (Type Library).
Snape (2005-10-05 20:47:00) [12]Спрошу, пользуясь случаем.
На каких версиях виндовс будет работать TXMLDocument?
Нужно ли устанавливать дополнительные программные модули?
Спасибо!
X9 (2005-10-05 19:41:00) [13]2 umbra
> У TXMLDocument нет ChildNodes. Они есть у Doc.DocumentElement.
Это серьёзное упущение с моей стороны. Большое Вам спасибо, учту. Но даже так код всё равно не работает :(. Вот переделанный кусок:
-----------------------------------------------------
uses
XMLDoc, XMLIntf;
...
procedure DoSomethingWithXML(FileName: string);
var
Doc: TXMLDocument;
Node: IXMLNode;
S: string;
begin
Doc := TXMLDocument.Create(FileName);
Doc.Active := true;
Node := Doc.DocumentElement; //<< Теперь AV вылетает здесь
S := Node.Attributes['Version']; // и переменная S остаётся пустой
ShowMessage(S);
end;
-----------------------------------------------------
Ошибка появляется в указанном месте. Может быть что-то не так с самим XML-файлом?
umbra (2005-10-05 18:58:00) [14]
> Node := Doc.ChildNodes.First;
У TXMLDocument нет ChildNodes. Они есть у Doc.DocumentElement. Ноды есть только у корневого елемента, а не у самого документа