Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с 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. Ноды есть только у корневого елемента, а не у самого документа


Наверх

Титульная страница Поиск, карта сайта Написать письмо