Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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]

;-) держи на 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");
...

дальше работаешь как и задумывал...


 
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 описано в rfc2119
3. 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.5 MB
Время: 0.025 c
14-1128681136
Игорь Шевченко
2005-10-07 14:32
2005.10.30
Holy war :)


14-1128580186
Мазут Береговой
2005-10-06 10:29
2005.10.30
Сделал открытие века! Такой вот я непоседа!


14-1128585427
MYSTERYO
2005-10-06 11:57
2005.10.30
8x видаху в 4х AGP порт. Будет ли работать?


9-1113983455
Asdi
2005-04-20 11:50
2005.10.30
Отзовитесь те кто хоть раз делал музыку к играм !!!


1-1129025202
Alex_Mel
2005-10-11 14:06
2005.10.30
Как корректно создать несколько экземпляров формы...