TXMLDocument и C++Builder

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
dykzei
Сообщения: 42
Зарегистрирован: 22 сен 2004, 14:35

привет. вот такой вопрос - как опреледить значение аттрибута хотя бы корневого элемента?... пробую такую штуку:

TXMLDocument * x_doc = new TXMLDocument("c:\\index.xml");
x_doc->Active = 1;
String s = (String)x_doc->DocumentElement->Attributes["title"];

...а содержимое файла примерно такое

<?xml version="1.0" encoding="iso-8859-1" ?>
<main title="Default theme">
<cell type="Hour A">
<region>
<points>
<point x="1" y="1" />
<point x="6" y="1" />
<point x="6" y="4" />
<point x="1" y="4" />
</points>
<colors>
<border_active value="06D92C" />
<border_inactive value="04A420" />
<inner_active value="048C1C" />
<inner_inactive value="024F10" />
</colors>
<states>
<char ascii="48" state="0" />
<char ascii="49" state="1" />
<char ascii="50" state="0" />
<char ascii="51" state="1" />
<char ascii="52" state="0" />
<char ascii="53" state="1" />
<char ascii="54" state="0" />
<char ascii="55" state="1" />
<char ascii="56" state="0" />
<char ascii="57" state="1" />
</states>
</region>
</cell>
</main>


и выдает ошибку Invalid Pointer Operation. В св-вах DOMVendor выставил MSXML.. помогите разобраться?:)
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

а) где проверки, что x_doc и т.д. определены
б) где вызов метода parse или аналогов?
Даже самый дурацкий замысел можно воплотить мастерски
dykzei
Сообщения: 42
Зарегистрирован: 22 сен 2004, 14:35

может тогда так?

TXMLDocument * x_doc;
String title;

try{
x_doc = new TXMLDocument(setup.apppth+"themes\\default.tmlcc");
x_doc->LoadFromFile(setup.apppth+"themes\\default.tmlcc");
x_doc->Active = 1;
title = (String)x_doc->DocumentElement->Attributes["title"];
x_doc->Active=0;
}catch(Exception &ex){
MessageBox(Handle,("Внимание : "+ex.Message).c_str(),"Ашыпка",MB_OK|MB_ICONSTOP);
}

delete x_doc;

ShowMessage(title);


ошибка та же... происходит имнно в строке получения аттрибута :-/
насчет метода parse - такого нет там...может парсинг выполняется при открытии файла?

PS: да, вот тут пишут, может меня это как-то тоже касается?..
Most likely, you are creating TXMLDocument like this:
var
Doc: TXMLDocument;
begin
Doc := TXMLDocument.Create(nil);
end;

The important thing to notice is that you are passing in nil as the owner. What happens then is that TXMLDocument takes on a different behavior; it acts as a reference counted object that automatically frees itself when those references reach zero. This means that the next time you do something to Doc that causes a decrease in the reference count, you run the risk of destroying the object and invalidating your reference. The problem is that so much happens to TXMLDocument behind the scenes, inside of the VCL, that it is hard to say when exactly the reference count is getting modified. The easiest way to get around this is to use an interface pointer instead of a TXMLDocument reference, like so:
var
Doc: IXMLDocument;
begin
Doc := TXMLDocument.Create(nil);
end;

This lets you have more complete control over the reference, allowing you to specify when exactly it gets decremented by setting the reference to nil.
dykzei
Сообщения: 42
Зарегистрирован: 22 сен 2004, 14:35

хм.. всем спасибо, я нашел решение, которое выглядит оказывается так:

_di_IXMLDocument x_doc;
x_doc=NewXMLDocument();
x_doc->LoadFromFile(setup.apppth+"themes\\default.tmlcc");
x_doc->Active=1;
if(x_doc->AsyncLoadState>3){
ShowMessage(x_doc->DocumentElement->Attributes["title"]);
}


никогда бы не подумал :-/ остается вопрос, как точно указать, что нужно использовать MSXML и будут ли у меня проблемы совместимости? ведь MSXML штука внешняя и подвержена постоянным пополнениям bugfix'ами, хотелось какой-то прозрачности

PS: и еще.. когда вызывается IXMLNode::NextSibling в док-ции написано, что в случае, если не найдено следующее - будет выдан Exception
If this node is the last node in its parent’s child list, NextSibling raises an exception.
а как же в таком случае мне проверить последний он или нет? других механизмов я не нашел, не ждать же Exception, правда?
Ответить