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

Вниз

Работа с TXMLDocument   Найти похожие ветки 

 
Katerina   (2003-07-17 16:12) [0]

Стоит задача сгенерировать XML документ из уже существующих кусков. Моя Функция возвращает узел IXMLNode c вложенными узлами. В главной функции создан XMLDocument, добавлены свои узлы.
В этом куске кода возникает access violation: В чем ошибка?

XMLTree := TXMLDocument.Create(nil);
XMLTree.Active := true;
node := XMLTree.AddChild("APPLICATION");

//функция возвращает IXMLNode
node := UIState.GetUIState(Source);

//конкретно в этой строчке приложение вылетает
XMLTree.DocumentElement.ChildNodes.Add (node);


 
yaJohn   (2003-07-17 16:19) [1]

Тонкий намек: нода в данном случае - Com обьект.
Попробуй передавать не через result, а через глобальную переменную.
А ежели шибко надо через result - можно поигратся AddRef, но чревато утечками памяти.


 
vuk   (2003-07-17 16:34) [2]

to Katerina:
Попытался смоделировать. Никаких AV. Поподробнее, что там у Вас функция возвращает.

to yaJohn:
Ваш тонкий намек абсолютно мимо. Во-первых нет никакой разницы, COM объект там или не COM (к тому же его там может и не быть). А во-вторых никаких проблем при передаче интерфейсов через Result нет в природе.


 
yaJohn   (2003-07-17 18:07) [3]

Я не большой знаток технологии COM, просто я уже сталкивался с подобной проблемой. И именно с MSXML.
В части случаев, присвоение переменным (result в.т.ч.) IXMLNode и иже с ним не приводит к ожидаемому эффекту. Т.е. либо не вызывается AddRef, либо лишний раз вызывается Releasе.
Если интересно, я могу найти тот проект.

2 Katerina
Я бы на вашем месте все же попробовал перед выходом из функции вызвать для эксперимента result.addref; и посмотреть, что получится (или не получится).


 
vuk   (2003-07-17 18:12) [4]

to yaJohn:
>И именно с MSXML.
Заметьте, тут нет ни слова об MSXML. Напомню, что TXMLDocument может работать не через MSXML (у меня, в основном, через OpenXML работает).


 
Юрий Федоров   (2003-07-17 19:03) [5]

XMLTree.DocumentElement не равен ли nil ?
его ведь тоже создать надо


 
Serginio   (2003-07-17 19:17) [6]

2 vuk © (17.07.03 16:34) Все зависит, чему мы присваиваем интерфейс Если к поинтеру то _addref обязателен, если к интерфейсу то Delphi делает это автоматически.
Яркий пример добавление интерфейса к Tlist. При добавлении _Addref при Удалении _Release;


 
Юрий Федоров   (2003-07-17 19:24) [7]

>>Serginio (17.07.03 19:17)
для этого TInterfaceList существует :-)


 
Serginio   (2003-07-17 19:32) [8]

Енто все понятно. Просто нужно знать чему присваивается интерфейс с учетом поведения Delphi. Именно ето я и хотел сказать. А напридумывать TInterfaceList , Array of IUnknow и все похожее в этом духе можно выше крыши.


 
vuk   (2003-07-17 19:52) [9]

to Юрий Федоров:
>XMLTree.DocumentElement не равен ли nil ?
после строки
node := XMLTree.AddChild("APPLICATION");
уже не nil.

to Serginio:
>Все зависит, чему мы присваиваем интерфейс
Это я в курсе. Это иногда даже специально делается для обхода подсчета ссылок. Но тут явно не в интерфейсах дело.


 
Юрий Федоров   (2003-07-17 19:53) [10]

>>vuk © (17.07.03 19:52)
проглядел :-(


 
Katerina   (2003-07-18 00:22) [11]

Спасибо за ответы, но кажется тут проблема в самом вопросе :)
Я попытаюсь описать чего я действительно хочу:
1. у меня есть 2 TXMLDocument, каждый из которых содержит свой кусок документа
2. мне надо создать на их основе 3-й TXMLDocument приблизительно такого вида:
<xml3>
<xml1>
</xml1>
<xml2>
</xml2>
</xml3>

Пробовала добавлять IXMLNode из одного документа в другой но устойчиво получала AV.Потом прочитала, что добавлять ноды из одного докумена в другой _вообще_ нельзя.
Так как мне быть... ?


 
yaJohn   (2003-07-18 12:43) [12]

Можно сделать процедуру рекурсивного копирования ноды между двумя документами.
Но ИМХО лучше поступить дешево и сердито:
procedure TForm1.Button1Click(Sender: TObject);
begin
DOMDocument1.loadXML ("<main1><node1/></main1>");
DOMDocument2.loadXML ("<main2><node2/></main2>");
DOMDocument3.loadXML (
"<main3>" +
DOMDocument1.documentElement{.firstChild}.xml +
DOMDocument2.documentElement{.firstChild}.xml +
"</main3>");
ShowMessage (DOMDocument3.documentElement.xml);
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
14-100876
Niobe
2003-07-16 08:51
2003.07.31
ели у Вас есть пример как подключить хелпу


3-100609
captive
2003-07-09 17:44
2003.07.31
Обработка событий InterBase


11-100650
romychk
2002-11-25 10:24
2003.07.31
Базы данных.


8-100846
Saracin
2003-02-05 19:32
2003.07.31
Как получить размеры картинки


3-100556
Till
2003-07-08 08:40
2003.07.31
FastReport генерация отчета на основе SQL запроса





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский