Главная страница
    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.01 c
14-100911
Spa81
2003-07-14 18:18
2003.07.31
TurboPower Async Professional


6-100870
Леопольд (К)
2003-05-24 10:37
2003.07.31
Всётаки фрейм


3-100637
ord3f8h
2003-07-07 19:18
2003.07.31
Как работать с DBGrid


3-100546
Beton-Karton
2003-07-11 11:31
2003.07.31
Удаление множества записей


1-100780
Erik
2003-07-16 15:59
2003.07.31
Отсутствует паралельность в com сервере.





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