Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Работа с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.043 c
1-1128954325
keal
2005-10-10 18:25
2005.10.30
Выборка с приоритетом


14-1128532591
Greenz
2005-10-05 21:16
2005.10.30
Коды системных ошибок Windows


14-1128695726
ArtemESC
2005-10-07 18:35
2005.10.30
Кодировки


1-1129009022
kolos_rus
2005-10-11 09:37
2005.10.30
Как узнать активную форму?


2-1128628970
Gefest80
2005-10-07 00:02
2005.10.30
Помогите с регистром!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский