Форум: "Основная";
Текущий архив: 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