Текущий архив: 2005.10.30;
Скачать: CL | DM;
ВнизРабота с TXMLDocument и IXMLNode Найти похожие ветки
← →
X9 © (2005-10-05 18:48) [0]Всем 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.
← →
umbra © (2005-10-05 18:58) [1]
> Node := Doc.ChildNodes.First;
У TXMLDocument нет ChildNodes. Они есть у Doc.DocumentElement. Ноды есть только у корневого елемента, а не у самого документа
← →
X9 © (2005-10-05 19:41) [2]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-файлом?
← →
Snape (2005-10-05 20:47) [3]Спрошу, пользуясь случаем.
На каких версиях виндовс будет работать TXMLDocument?
Нужно ли устанавливать дополнительные программные модули?
Спасибо!
← →
X9 © (2005-10-05 21:56) [4]2 Snape
Насчёт версий Windows не знаю, точно работает на Delphi7/WinXP. Где-то читал, что для более ранних версий Delphi нужно было отдельно импортировать библиотеку типов (Type Library).
← →
Snape (2005-10-05 21:58) [5]
> X9 © (05.10.05 21:56) [4]
Ну меня больше волнует не версия делфи, а именно версия виндовс =)
← →
X9 © (2005-10-05 22:24) [6]Про "виндовс" не знаю, но есть большое количество альтернативных парсеров, не уступающим по функциональности продукту Microsoft. Можно посмотреть на http://torry.net .
← →
Eraser © (2005-10-05 22:38) [7]
> X9 © (05.10.05 18:48)
Может это поможет
http://forum.codenet.ru/showthread.php?threadid=14997
← →
X9 © (2005-10-05 22:47) [8]2 Eraser
К сожалению, ничего толкого не нашёл.
Хотя ситуация похожая - всё, кажется, проще некуда, но ...
← →
Eraser © (2005-10-05 23:39) [9]
> X9 © (05.10.05 22:47) [8]
;-) держи на Delphivar
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");
...
дальше работаешь как и задумывал...
← →
Slym © (2005-10-06 05:17) [10]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;
← →
X9 © (2005-10-06 07:10) [11]Всё, разобрался!
Если вместо конструктора Create(const AFileName: WideString) использовать Create(AOwner: TComponent) с аргументом <> nil, то всё работает! Однако, остаётся непонятным наличие второго конструктора, если он не работает, и то, почему не работает Create(nil).
← →
Igor_thief (2005-10-06 10:20) [12]Относительно версий - будет работать там где есть IE.
Относительно проблемы - просто замени в объявлении TXMLDocument на IXMLDocument. Теоретически должно работать.
← →
Чапаев © (2005-10-06 11:44) [13]<?xml ...?> -- так должен начинаться XML-документ. Какие там нужно прописать атрубуты -- смотри в спецификации XML.
← →
wal © (2005-10-06 13:14) [14]
> [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 should begin with an XML declaration which specifies the version of XML being used.]
А что такое should описано в rfc21193. SHOULD This word, or the adjective "RECOMMENDED", mean that there
may exist valid reasons in particular circumstances to ignore a
particular item, but the full implications must be understood and
carefully weighed before choosing a different course.
Что, вобщем то, совсем не обозначает "ДОЛЖЕН".
С уважением.
Страницы: 1 вся ветка
Текущий архив: 2005.10.30;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.041 c